2012-12-22 35 views
5

मैं इस तरह विधि है, और JSON के रूप में वापस करना चाहते हैं, लेकिन यह लिखते हैं कि पोस्ट वस्तु Json serializable नहीं है: एसबोतल Jsonify mongoengine क्वेरी

def show_results_async(text): 
    query = { '$or':[{'title':{'$regex':text}},{'author':{'$regex':text}} ]} 
    posts = Posts.objects(__raw__=(query)) 
    return jsonify(result = posts) 
+0

कारण है कि यह '__raw __ = (क्वेरी)' है? क्या आपका मतलब '__raw __ = (क्वेरी,) 'या' __raw __ = क्वेरी' था? –

उत्तर

3

tl, डॉ: कोई निर्मित समारोह है जो एक मोंगोइंजिन दस्तावेज़ JSON में परिवर्तित करेगा। तो आपको अपना खुद लिखना होगा।

views.py में:

def show_results_async(text): 
    query = { '$or':[{'title':{'$regex':text}},{'author':{'$regex':text}} ]} 
    posts = Posts.objects(__raw__=(query)) 
    return jsonify(result=posts.to_dict()) 

post.py में, जोड़ें:

def to_dict(self): 
    return helper.mongo_to_dict(self) 

helper.py में:

def mongo_to_dict(obj): 
    return_data = [] 

    if isinstance(obj, Document): 
     return_data.append(("id",str(obj.id))) 

    for field_name in obj._fields: 

     if field_name in ("id",): 
      continue 

     data = obj._data[field_name] 

     if isinstance(obj._fields[field_name], DateTimeField): 
      return_data.append((field_name, str(data.isoformat()))) 
     elif 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)) 
     elif isinstance(obj._fields[field_name], EmbeddedDocumentField): 
      return_data.append((field_name, mongo_to_dict(data))) 

    return dict(return_data) 

कुछ नोट:

  • यदि आपके दस्तावेज़ में अतिरिक्त फ़ील्ड प्रकार हैं, तो आपको उपरोक्त सहायक फ़ंक्शन को बढ़ाने की आवश्यकता है।
  • उपरोक्त सहायक विधि Thomas' answer to a question से प्रेरित थी। अतिरिक्त कार्यक्षमता में शामिल हैं: एम्बेडेड दस्तावेज़ों को दोबारा प्रिंट करें और दस्तावेज़ की आईडी शामिल करें।
+0

'my_document.to_json() 'एक मोंगोइंजिन दस्तावेज़ JSON में परिवर्तित करता है। यह JSON हालांकि (jsonify() 'पर काम नहीं करता है। मैंने इसे 'json.loads() 'का उपयोग एक ताना में बदलने के लिए किया था और फिर' jsonify() 'वापस लौटाया, हालांकि शायद एक बेहतर तरीका है। – Josh

11

आप mongoengine अंतर्निहित विधि का उपयोग कर सकते हैं: to_json()। कि ऊपर के उदाहरण के लिए, आप इस तरह उपयोग कर सकते हैं:

def show_results_async(text): 
    query = { '$or':[{'title':{'$regex':text}},{'author':{'$regex':text}} ]} 
    posts = Posts.objects(__raw__=(query)) 
    return jsonify(result = posts.to_json()) 
+0

क्या बैकस्लैश-एस्केप उद्धरण नहीं है, क्योंकि यह डबल जेसन-इफिड है? मुझे post.objects में पोस्ट के लिए 'jsonify (परिणाम = [json.loads (post.to_json()) जैसे कुछ करने की आवश्यकता है)। – Josh

1

यह काम करता है हालांकि मैं अगर यह सबसे कारगर तरीका है पता नहीं है:

import json 

@app.route('/api/my-objects/') 
def get_objects(): 
    all_objects = [json.loads(o.to_json()) for o in MyObject.objects] 

    return jsonify({"my_objects": all_objects})