2010-02-11 12 views
34

यह कैसे हो सकता है कि यह त्रुटि उठाई गई? मैं इस में प्रवेश किया:Django: "TypeError: [] JSON serializable नहीं है" क्यों?

def json(self): 
    return json.dumps(
     { 
      'items': self.items 
     } 
    ) 

और कहा कि त्रुटि मिली (क्योंकि self.items एक खाली क्वेरीसमूह (Django)

था लेकिन तब,

def json(self): 
    return json.dumps(
     { 
      'items': [] # Pass in empty list to prove that the error was idiotic. 
     } 
    ) 

ठीक काम किया (जो कम से कम साबित होता है कि त्रुटि संदेश बेकार है)

ऐसा इसलिए है क्योंकि क्वेरीसेट repr() को परिभाषित करता है और जब यह खाली या somethin होता है तो स्ट्रिंग के रूप में '[]' देता है जी हास्यास्पद है कि?

+3

आप जिस मॉड्यूल का उपयोग कर रहे हैं उसके समान नाम के साथ फ़ंक्शन को परिभाषित क्यों कर रहे हैं? –

+0

@gnibbler यह एक फ़ंक्शन नहीं है। यह एक विधि है और मैं इसे @property के रूप में उपयोग कर रहा हूं (इसमें मेरे उदाहरण में शामिल नहीं है)। – orokusaki

+3

मुझे वापस देखकर प्यार है कि मैं कितना स्मग था, '... त्रुटि बेवकूफ थी। – orokusaki

उत्तर

54

क्वेरीज़ आउट-ऑफ-द-बॉक्स नहीं हैं। यदि आप self.items के बजाय list(self.items) आज़माएं, तो इसे तब तक काम करना चाहिए जब तक कि आइटम स्वयं JSON-serializable हैं।

अद्यतन: यह खाली नहीं होने पर भी अपवाद उठाएगा। मुझे नहीं लगता कि इसे एक Django बग के रूप में स्वीकार किया जाएगा, बेशक आप कोशिश कर सकते हैं; सबसे आसान जवाब list(qs) का उपयोग करके मूल्यांकन को मजबूर करना है, जैसा कि मैंने पहले ही कहा है।

+1

+1। यह जवाब है। आप क्वेरीसेट (क्वेरीसेट) का उपयोग कर क्वेरीसेट को तुरंत मूल्यांकन करने के लिए मजबूर कर रहे हैं। एक सूची के रूप में अंतर्निहित डेटा क्रमिक है; क्वेरीसेट स्वयं नहीं है। http://docs.djangoproject.com/en/dev/ref/models/querysets/#id1 – cethegeek

+2

अच्छा उत्तर। धन्यवाद। बीटीडब्ल्यू, यह एक बग की तरह लगता है। मैं इसके लिए टिकट शुरू करने जा रहा हूं। Django के serializers Django क्वेरीसेट serializing के लिए हैं। यदि यह खाली होने पर अपवाद उठाता है, तो यह एक बग है। – orokusaki

+1

@orokusaki, यह मुझे एक बग की तरह महसूस नहीं करता है। कभी-कभी आप वस्तुओं को चाहते हैं। कभी-कभी आप स्ट्रिंग चाहते हैं। Django आपको चुनने देता है। यहां एक और पाइथनिक विकल्प है जो मेरे लिए काम करता है, सभी Django फ़ील्ड के लिए: '[str (obj) model.objects.values ​​() में obj के लिए] [नीचे देखें] (http://stackoverflow.com/a/14653384/ 623,735) – hobs

5

यह बहुत निराशाजनक है। Django के serialization सब कुछ के बारे में शिकायत करता है जो एक क्वेरी सेट नहीं है और json.dumps Django के ORM समर्थन से ऑब्जेक्ट्स के बारे में शिकायत करता है।

>>> from cluster.models import Account 
>>> import json 
>>> json.dumps(Account.objects.all()[0]) 
Traceback (most recent call last): 
    File "<console>", line 1, in <module> 
    File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/__init__.py", line 231, in dumps 
    return _default_encoder.encode(obj) 
    File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/encoder.py", line 201, in encode 
    chunks = self.iterencode(o, _one_shot=True) 
    File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/encoder.py", line 264, in iterencode 
    return _iterencode(o, 0) 
    File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/encoder.py", line 178, in default 
    raise TypeError(repr(o) + " is not JSON serializable") 
TypeError: <Account: 9de5-2653-000d-81a3 => [email protected]> is not JSON serializable 

बनाम

>>> serializers.serialize("json", [clusters]) 
Traceback (most recent call last): 
    File "<console>", line 1, in <module> 
    File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/core/serializers/__init__.py", line 91, in serialize 
    s.serialize(queryset, **options) 
    File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/django/core/serializers/base.py", line 41, in serialize 
    for field in obj._meta.local_fields: 
AttributeError: 'QuerySet' object has no attribute '_meta' 
4

के रूप में विनय ने कहा, भले ही आप एक सूची में डाली, क्रमबद्धता अक्सर अब भी विफल रहता है। मेरे लिए, serialization DateTimeField तत्वों (datetime.datetime ऑब्जेक्ट्स) पर विफल रहता है, भले ही मैं के साथ ValuesQuerySet (सूची-जैसी) मांगूं। मेरे लिए समाधान एक साधारण समझ थी।

json.dumps([str(obj) for obj in Model.objects.values()]); 

आपके मामले में, कि हो सकता है

return json.dumps({k: str(v) for k, v in self.__dict__.items()}) 

str के जादू दिन बचाता है। repr अंतर्निहित भी सहायक हो सकता है यदि आपको अपने क्रमिकरण में ऑब्जेक्ट प्रकार की जानकारी की आवश्यकता है।

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