2014-09-26 5 views
17

Django 1.7 ने JsonResponse objects पेश किया, जिसे मैं अपने AJAX अनुरोध में मानों की एक सूची वापस करने के लिए उपयोग करने का प्रयास करता हूं।मॉडल फ़ील्ड को JsonResponse ऑब्जेक्ट में कैसे पास करें

मैं एक JsonResponse वस्तु को

>>> Genre.objects.values('name', 'color') 
[{'color': '8a3700', 'name': 'rock'}, {'color': 'ffff00', 'name': 'pop'}, {'color': '8f8f00', 'name': 'electronic'}, {'color': '9e009e', 'name': 'chillout'}, {'color': 'ff8838', 'name': 'indie'}, {'color': '0aff0a', 'name': 'techno'}, {'color': 'c20000', 'name': "drum'n'bass"}, {'color': '0000d6', 'name': 'worldmusic'}, {'color': 'a800a8', 'name': 'classic'}, {'color': 'dbdb00', 'name': 'hiphop'}] 

पास करना चाहते हैं।

हालांकि, मेरे प्रयास विफल हो जाते हैं।

>>> JsonResponse({'foo': 'bar', 'blib': 'blab'}) # works 
<django.http.response.JsonResponse object at 0x7f53d28bbb00> 

>>> JsonResponse(Genre.objects.values('name', 'color')) # doesn't work 
Traceback (most recent call last): 
    File "<console>", line 1, in <module> 
    File "/home/marcel/Dokumente/django/FlushFM/env/lib/python3.4/site-packages/django/http/response.py", line 476, in __init__ 
    raise TypeError('In order to allow non-dict objects to be ' 
TypeError: In order to allow non-dict objects to be serialized set the safe parameter to False 

यह Genre.objects.values() के विभिन्न डेटा संरचना की वजह से शायद है।

यह कैसे किया जाएगा सही?

[संपादित करें]

safe=False साथ

मैं

>>> JsonResponse(Genre.objects.values('name', 'color'), safe=False) 
Traceback (most recent call last): 
    File "<console>", line 1, in <module> 
    File "/home/marcel/Dokumente/django/FlushFM/env/lib/python3.4/site-packages/django/http/response.py", line 479, in __init__ 
    data = json.dumps(data, cls=encoder) 
    File "/usr/lib/python3.4/json/__init__.py", line 237, in dumps 
    **kw).encode(obj) 
    File "/usr/lib/python3.4/json/encoder.py", line 192, in encode 
    chunks = self.iterencode(o, _one_shot=True) 
    File "/usr/lib/python3.4/json/encoder.py", line 250, in iterencode 
    return _iterencode(o, 0) 
    File "/home/marcel/Dokumente/django/FlushFM/env/lib/python3.4/site-packages/django/core/serializers/json.py", line 109, in default 
    return super(DjangoJSONEncoder, self).default(o) 
    File "/usr/lib/python3.4/json/encoder.py", line 173, in default 
    raise TypeError(repr(o) + " is not JSON serializable") 
TypeError: [{'color': '8a3700', 'name': 'rock'}, {'color': 'ffff00', 'name': 'pop'}, {'color': '8f8f00', 'name': 'electronic'}, {'color': '9e009e', 'name': 'chillout'}, {'color': 'ff8838', 'name': 'indie'}, {'color': '0aff0a', 'name': 'techno'}, {'color': 'c20000', 'name': "drum'n'bass"}, {'color': '0000d6', 'name': 'worldmusic'}, {'color': 'a800a8', 'name': 'classic'}, {'color': 'dbdb00', 'name': 'hiphop'}] is not JSON serializable 

क्या काम करता है

>>> JsonResponse(list(Genre.objects.values('name', 'color')), safe=False) 
<django.http.response.JsonResponse object at 0x7f53d28bb9e8> 

है लेकिन वहाँ एक बेहतर तरीका एक मॉडल वस्तु के बाहर एक dict उत्पन्न करने के लिए नहीं है?

+1

क्या आपने त्रुटि संदेश कहने का प्रयास किया था? –

+0

@DanielRoseman अच्छी तरह से हाँ, लेकिन 'सुरक्षित = गलत' सेटिंग भी एक त्रुटि संदेश होगा। क्या आपको आउटपुट की आवश्यकता है? – speendo

+1

@speendo क्या यह 'सुरक्षित = गलत' के साथ भी वही त्रुटि है? शायद 'ValuesQuerySet'' सूची() ': 'JsonResponse (सूची (Genre.objects.values ​​(' name ',' color ') को पार करने के बाद इसे आजमाएं))' –

उत्तर

18

भविष्य में संदर्भ के लिए, .values() एक ValuesQuerySet कि शब्दकोशों की एक iterable पूर्ण तरह बर्ताव करता है देता है, तो list() का उपयोग कर इसे में सभी शब्दकोशों के साथ एक list का एक नया उदाहरण कर देगा। इसके साथ, आप एक नया नियम बना सकते हैं और उसे क्रमबद्ध कर सकते हैं।

response = JsonResponse(dict(genres=list(Genre.objects.values('name', 'color')))) 

IIRC, यह एक JSON ऑब्जेक्ट रूट के रूप में एक सूची है कि करने के लिए सुरक्षित नहीं है और कहा कि शायद यही कारण है Django शिकायत कर रहा है है। मुझे स्रोत प्रदान करने के लिए अब इसके बारे में कोई संदर्भ नहीं मिला, क्षमा करें।

+1

http://stackoverflow.com/a/26833156/179583 पर उत्तर django से 'serializers' का उपयोग करता है। कोर, जो पूरे मॉडल को प्राप्त करने के लिए आसान हो सकता है लेकिन जेसन रेस्पॉन्स को पहले से ही सीरियलाइज्ड जेएसओएन पास करने के लिए अजीब/सकल लगता है। मुझे इस जवाब की तकनीक बेहतर पसंद है, खासकर जब मुझे केवल प्रत्येक मॉडल से कुछ फ़ील्ड चाहिए। – natevw

+0

I इस तरह के जवाब के लिए बहुत लंबा लग रहा है! – Vizjerei

संबंधित मुद्दे