<Django ऑब्जेक्ट> JSON अनुक्रमिक नहीं है


102

मेरे पास क्वेरी को क्रमांकित करने के लिए निम्न कोड है;

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 ()>। क्योंकि सूची django ऑब्जेक्ट्स और dicts दोनों से बनी है। कोई विचार ?


जवाबों:


115

simplejsonऔर jsondjango वस्तुओं के साथ अच्छी तरह से काम नहीं करते हैं।

Django के बिल्ट-इन सीरियलएजर केवल django ऑब्जेक्ट्स से भरे क्वेरीज़ को क्रमबद्ध कर सकते हैं:

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

आपके मामले में, self.get_queryset()अंदर django ऑब्जेक्ट्स और dicts का मिश्रण है।

एक विकल्प यह है कि मॉडल के उदाहरणों से छुटकारा पाएं 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'... और Django का उपयोग 1.4+
ट्यूना

3
जब मॉडल में डेटाटाइम फ़ील्ड होता है, तो यह काम नहीं करता है।
ax003d

यह समाधान बहुत सारे प्रश्नों को ट्रिगर करेगा
Julio Marins

जेएस में सीधे उपयोग करने के लिए, बस safeटेज का उपयोग करें । stackoverflow.com/a/57939897/4157431
रामी अल्लौस

63

सबसे आसान तरीका एक JsonResponse का उपयोग करना है

किसी क्वेरीसेट के लिए, आपको valuesउस क्वेरीसेट के लिए एक सूची पास करनी चाहिए , जैसे:

from django.http import JsonResponse

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

2
धन्यवाद .values ​​() के लिए, मेरे मामले में, मुझे सिर्फ फिल्टर के बाद .values ​​() जोड़ना होगा
Jze

18

मैंने पाया कि यह ".values" विधि का उपयोग करते हुए सरल किया जा सकता है, जो नाम वाले फ़ील्ड भी देता है:

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

"सूची" का उपयोग डेटा को चलने-फिरने के लिए किया जाना चाहिए, क्योंकि "मान क्वेरी" प्रकार केवल एक तानाशाही के रूप में उठाए जाने पर एक तानाशाह है।

प्रलेखन: https://docs.djangoproject.com/en/1.7/ref/models/querysets/#velues


इसने मेरे लिए अच्छा काम किया। भले ही त्रुटि संदेश से पता चलता है कि यह सब एक बड़ी सूची में है, फिर list()भी स्पष्ट रूप से इसकी आवश्यकता है।
trpt4him

1
सबसे सरल और सबसे अच्छा समाधान
तैमूर

11

संस्करण 1.9 से आसान और json होने का आधिकारिक तरीका

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


return JsonResponse(  model_to_dict(modelinstance) )

8

हमारे js-programmer ने मुझे json-encoded string के बजाय सटीक JSON फॉर्मेट डेटा वापस करने के लिए कहा।

नीचे समाधान है। (यह एक ऐसी वस्तु लौटाएगा जिसका उपयोग ब्राउज़र में सीधे किया जा सकता है / देखा जा सकता है)

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()))

यह काफी अच्छा काम करता है

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.