2011-05-27 13 views
6

तो मैं एक परियोजना के लिए एक JSON ऑब्जेक्ट वापस करने की कोशिश कर रहा हूं। मैंने जेजेओ को सिर्फ जेएसओएन लौटने की कोशिश करने में कुछ घंटे बिताए हैं।Django के साथ MongoEngine Pymongo का उपयोग कर JSON ऑब्जेक्ट वापस नहीं कर सकता?

यहाँ विचार है कि हम साथ काम कर रहा है:

def json(request, first_name): 
    user = User.objects.all() 
    #user = User.objects.all().values() 
    result = simplejson.dumps(user, default=json_util.default) 
    return HttpResponse(result) 

यहाँ मेरी मॉडल है: पर कैसे

[<User: User object>, <User: User object>] is not JSON serializable 

किसी भी विचार:

class User(Document): 
    gender = StringField(choices=['male', 'female', 'Unknown']) 
    age = IntField() 
    email = EmailField() 
    display_name = StringField(max_length=50) 
    first_name = StringField(max_length=50) 
    last_name = StringField(max_length=50) 
    location = StringField(max_length=50) 
    status = StringField(max_length=50) 
    hideStatus = BooleanField() 
    photos = ListField(EmbeddedDocumentField('Photo')) 
    profile =ListField(EmbeddedDocumentField('ProfileItem')) 
    allProfile = ListField(EmbeddedDocumentField('ProfileItem')) #only return for your own profile 

यह यह क्या लौटा रहा है है मैं बस जेएसओएन वापस कर सकता हूँ?

उत्तर

8

simplejson.dumps() नहीं जानता कि कैसे अपने कस्टम ऑब्जेक्ट्स तक पहुंचें; default फ़ंक्शन, json_util.default केवल आपके दस्तावेज़ों पर str() या repr() पर कॉल करना होगा।

अंततः अपने default समारोह MongoEngine दस्तावेजों की समझ बनाने के लिए सक्षम होने के लिए की आवश्यकता होगी (आपके द्वारा लिखी गई? हां, तो इसके स्रोत यहाँ दिखा अपना दावा साबित हो सकता है, तो json_util कस्टम कोड है।),। मैं कम से कम दो तरीके के बारे में सोच सकते हैं कि यह लागू किया जा सकता:

  1. लिखें कस्टम default समारोह है कि उनके _fields विशेषता (आत्मनिरीक्षण करके सभी MongoEngine दस्तावेज़ों के लिए काम करता है, हालांकि टिप्पणी अग्रणी अंडरस्कोर इसका मतलब है कि इस का हिस्सा है मोंगोइंजिन का निजी एपीआई/कार्यान्वयन विवरण और भविष्य के संस्करणों में परिवर्तन के अधीन हो सकता है)

  2. क्या आपके प्रत्येक दस्तावेज़ as_dict विधि को लागू करते हैं जो ऑब्जेक्ट का एक शब्दकोश प्रस्तुतिकरण देता है। यह मोंगोइंजिन द्वारा दस्तावेजों पर प्रदान की गई to_mongo विधि के समान काम करेगा, लेकिन _types या _cls फ़ील्ड्स (फिर से, ये मोंगोइंजिन के कार्यान्वयन विवरण) को वापस नहीं करना चाहिए।

मैं तुम्हें # 2 विकल्प के साथ जाना सुझाव देंगे: कोड क्लीनर और पढ़ने में आसान, बेहतर समझाया हो जाएगा, और किसी भी निजी APIs का उपयोग की जरूरत नहीं होगी।

4

जैसा कि डीक्रॉस्टा ने सुझाव दिया है कि आप ऐसा कुछ कर सकते हैं, उम्मीद है कि इससे आपकी मदद मिलेगी।

दस्तावेज़ परिभाषा

class MyDocument(Document): 
    # Your document definition 

    def to_dict(self): 
     return mongo_to_dict_helper(self) 

helper.py:

from mongoengine import StringField, ListField, IntField, FloatField 

def mongo_to_dict_helper(obj): 
    return_data = [] 
    for field_name in obj._fields: 
     if field_name in ("id",): 
      continue 

     data = obj._data[field_name] 

     if isinstance(obj._fields[field_name], StringField): 
      return_data.append((field_name, str(data))) 
     elif isinstance(obj._fields[field_name], FloatField): 
      return_data.append((field_name, float(data))) 
     elif isinstance(obj._fields[field_name], IntField): 
      return_data.append((field_name, int(data))) 
     elif isinstance(obj._fields[field_name], ListField): 
      return_data.append((field_name, data)) 
     else: 
      # You can define your logic for returning elements 
    return dict(return_data) 
10
MongoEngine 0.8 या अधिक से अधिक, वस्तुओं और क्वेरीसमूहों एक to_json() विधि के साथ

>>> User.objects.to_json() 
संबंधित मुद्दे