2013-05-28 6 views
55

मेरे पास क्वेरीसेट को क्रमबद्ध करने के लिए निम्न कोड है;<Django ऑब्जेक्ट> JSON serializable नहीं है

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 दोनों से बना सूची। कोई विचार ?

उत्तर

65

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

Django के अंतर्निहित serializers केवल Django वस्तुओं से भर क्वेरीसमूहों को क्रमानुसार कर सकते हैं:

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

आपके मामले में, self.get_queryset() Django वस्तुओं और dicts अंदर का मिश्रण होता है।

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

आशा है कि मदद करता है:

एक विकल्प self.get_queryset() में मॉडल उदाहरणों से छुटकारा और उन्हें model_to_dict का उपयोग कर dicts के साथ बदलें करने के लिए है।

+0

अब हो रही त्रुटि -> ' 'NoneType' ऑब्जेक्ट कोई विशेषता 'concrete_model'' है .. और Django 1.4+ – tunaktunak

+0

का उपयोग करके मैंने जवाब संपादित किया है। कृपया देखें कि क्या यह मदद करता है। – alecxe

+2

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

5

सबसे पहले मैंने अपने मॉडल में एक 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())) 

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

12

मैंने पाया कि इस बल्कि एक सरल ".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/#values

+0

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

+0

सरल और सर्वोत्तम समाधान – Timur

3

संस्करण 1.9 आसान और json

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


return JsonResponse( model_to_dict(modelinstance)) 
11

सबसे आसान तरीका होने का आधिकारिक रास्ता से एक JsonResponse उपयोग करने के लिए है।

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

from django.http import JsonResponse 

queryset = YourModel.objects.filter(some__filter="some value").values() 
return JsonResponse({"models_to_return": list(queryset)}) 
संबंधित मुद्दे