<জ্যাঙ্গো অবজেক্ট> জেএসওএন সিরিয়ালযোগ্য নয়


106

ক্যোরিসেটটি সিরিয়ালাইজ করার জন্য আমার কাছে নিম্নলিখিত কোড রয়েছে;

def render_to_response(self, context, **response_kwargs):

    return HttpResponse(json.simplejson.dumps(list(self.get_queryset())),
                        mimetype="application/json")

এবং নিম্নলিখিত আমার হয় get_querset()

[{'product': <Product: hederello ()>, u'_id': u'9802', u'_source': {u'code': u'23981', u'facilities': [{u'facility': {u'name': {u'fr': u'G\xe9n\xe9ral', u'en': u'General'}, u'value': {u'fr': [u'bar', u'r\xe9ception ouverte 24h/24', u'chambres non-fumeurs', u'chambres familiales',.........]}]

যা আমার সিরিয়ালাইজ করা দরকার। তবে এটি সিরিয়ালিয়াল করতে সক্ষম নয় বলে জানিয়েছে <Product: hederello ()>। কারণ উভয় জ্যাঞ্জো অবজেক্ট এবং ডিকস সমন্বিত তালিকা। কোন ধারনা ?



উত্তর:


117

simplejsonএবং jsonজ্যাঙ্গো অবজেক্টের সাথে ভালভাবে কাজ করবেন না।

জ্যাঙ্গোর অন্তর্নির্মিত সিরিয়ালাইজারগুলি কেবল জ্যাঙ্গো অবজেক্টে ভরা জিজ্ঞাস্যকে সিরিয়ালাইজ করতে পারে:

data = serializers.serialize('json', self.get_queryset())
return HttpResponse(data, content_type="application/json")

আপনার ক্ষেত্রে, self.get_queryset()ভিতরে জাঙ্গো অবজেক্ট এবং ডিক্টসের মিশ্রণ রয়েছে।

একটি বিকল্প হ'ল মডেলের দৃষ্টান্তগুলি পরিত্রাণ পেতে self.get_queryset()এবং তাদের ব্যবহার করে ডিক্টগুলি প্রতিস্থাপন করুন model_to_dict:

from django.forms.models import model_to_dict

data = self.get_queryset()

for item in data:
   item['product'] = model_to_dict(item['product'])

return HttpResponse(json.simplejson.dumps(data), mimetype="application/json")

আশা করি এইটি কাজ করবে.


এখন ত্রুটি হচ্ছে -> 'NoneType' object has no attribute 'concrete_model'... এবং জ্যাঙ্গো 1.4+ ব্যবহার করছে
টুনা

4
যখন মডেলটির একটি ডেটটাইম ক্ষেত্র থাকে, তখন এটি কার্যকর হয় না।
ax003d

এই সমাধানটি অনেকগুলি
প্রশ্নকে

এটি সরাসরি safeজেএসে ব্যবহার করতে, কেবল টেগ ব্যবহার করুন । stackoverflow.com/a/57939897/4157431
রামি আলুশ

66

সবচেয়ে সহজ উপায় হ'ল জসোনারেস্পোনস ব্যবহার করা ।

ক্যোরিসেটের valuesজন্য আপনার সেই ক্যোয়ারসেটের জন্য এর একটি তালিকা পাস করা উচিত :

from django.http import JsonResponse

queryset = YourModel.objects.filter(some__filter="some value").values()
return JsonResponse({"models_to_return": list(queryset)})

4
। মূল্যবোধের জন্য ধন্যবাদ (), আমার ক্ষেত্রে, আমাকে কেবল ফিল্টার পরে। মূল্যগুলি () যুক্ত করতে হবে
জজে

20

আমি দেখতে পেয়েছি যে এটি "। মূল্যবোধ" পদ্ধতিটি ব্যবহার করে বরং সাধারণ কাজটি করা যেতে পারে, যা নামযুক্ত ক্ষেত্রগুলি দেয়:

result_list = list(my_queryset.values('first_named_field', 'second_named_field'))
return HttpResponse(json.dumps(result_list))

"তালিকা" টি পুনরুক্তযোগ্য হিসাবে ডেটা পেতে অবশ্যই ব্যবহার করা উচিত, যেহেতু "মান ক্যোয়ারসেট" প্রকারটি কেবল পুনরাবৃত্ত হিসাবে বেছে নেওয়া হলে একটি ডিক dict

ডকুমেন্টেশন: https://docs.djangoproject.com/en/1.7/ref/models/querysets/#values


এটি আমার পক্ষে ভাল কাজ করেছে। ত্রুটি বার্তাটি এগুলি সমস্ত একটি বড় তালিকায় রাখার পরামর্শ list()দিলেও, দৃশ্যত এখনও এটি প্রয়োজনীয়।
trpt4him

4
সহজতম এবং সর্বোত্তম সমাধান
তৈমুর

13

সংস্করণ 1.9 থেকে জসন পাওয়ার সহজ ও সরকারী উপায় From

from django.http import JsonResponse
from django.forms.models import model_to_dict


return JsonResponse(  model_to_dict(modelinstance) )

8

আমাদের জেএস-প্রোগ্রামার আমাকে তার কাছে জেসন-এনকোডড স্ট্রিংয়ের পরিবর্তে সঠিক জেএসএন ফর্ম্যাট ডেটা ফিরিয়ে দিতে বলেছিল।

নীচে সমাধানটি ((এটি এমন কোনও বস্তু ফেরত দেবে যা ব্রাউজারে সরাসরি ব্যবহার করা / দেখা যায়)

import json
from xxx.models import alert
from django.core import serializers

def test(request):
    alert_list = alert.objects.all()

    tmpJson = serializers.serialize("json",alert_list)
    tmpObj = json.loads(tmpJson)

    return HttpResponse(json.dumps(tmpObj))

আরও ভাল হবেHttpResponse(tmpObj)
পাবলো দাজ

6

প্রথমে আমি আমার মডেলটিতে to_dict পদ্ধতি যুক্ত করেছি;

def to_dict(self):
    return {"name": self.woo, "title": self.foo}

তাহলে আমার এই আছে;

class DjangoJSONEncoder(JSONEncoder):

    def default(self, obj):
        if isinstance(obj, models.Model):
            return obj.to_dict()
        return JSONEncoder.default(self, obj)


dumps = curry(dumps, cls=DjangoJSONEncoder)

এবং শেষে আমার ক্লাসেটটি সিরিয়াল করতে এই শ্রেণীর ব্যবহার করুন।

def render_to_response(self, context, **response_kwargs):
    return HttpResponse(dumps(self.get_queryset()))

এটি বেশ ভাল কাজ করে

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.