2013-01-31 19 views
6

मैं मोंगोडिन के साथ मोंगोएन्गिन के साथ Django में एक एपीआई के लिए बैकएंड के रूप में उपयोग कर रहा हूं। एपीआई बनाने के लिए मैं जिस फ्रेमवर्क का उपयोग कर रहा हूं वह है Django Rest Framework।Django Rest Framework Dictionary फ़ील्ड

मुझे मोंगो में एक क्षेत्र में एक शब्दकोश को स्टोर करने की आवश्यकता है और जब मैंने विधि पोस्ट कहा जाता है तो मैंने सबसे अच्छा किया है, एक charfield का उपयोग करना और function restore_object में शब्दकोश को पार्स करना है।

इस लक्ष्य को प्राप्त करने का एक बेहतर तरीका है?

एक नियम क्षेत्र बनाना बेहतर है? मुझे नहीं पता कि यह कितना मुश्किल हो सकता है।

धन्यवाद।

कुछ कोड दिखाने के लिए संपादित किया गया है, ध्यान दें कि मैं शब्दकोश को एक dict (DictField) के रूप में संग्रहीत करता हूं और इसकी सामग्री एक ऑब्जेक्ट से दूसरे ऑब्जेक्ट में बदल सकती है।

मेरी mongoengine मॉडल है कुछ की तरह:

class MyDoc(mongoengine.Document): 
    name = mongoengine.StringField(max_length=200) 
    context = mongoengine.DictField() 

और की तरह मेरे serializer कुछ:

class MyDocSerializer(serializers.Serializer): 

name = serializers.CharField(max_length=200) 
context = serializers.CharField() 
url = serializers.HyperlinkedIdentityField(
view_name="drf:mydoc-detail",) 

def __init__(self,*args,**kwargs): 
    super(MyDocSerializer,self).__init__(*args,**kwargs) 


def restore_object(self, attrs, instance=None): 

    #Parse string to dict 
    #this is so ugly, notice I had to repace ' for " to 
    #avoid an error parsing the json 
    context = JSONParser().parse(
    StringIO.StringIO(
     attrs['context'].replace("'","\"") 
    ) 
    ) 

    attrs['context'] = context 
    if instance is not None: 
     instance.name = attrs['name'] 
     instance.context = context 
     return instance 

    return MyDoc(**attrs) 
+0

आप अपने दस्तावेज़ परिभाषाएँ और कुछ कोड पोस्ट कर सकता है? मुझे लगता है कि यह उपयोगी होगा – dm03514

+0

आप पिमोंगो सीरियलाइज़र का उपयोग कर सकते हैं - देखें: http://api.mongodb.org/python/current/api/bson/json_util.html – Ross

+0

2016 में आप Django-REST-Framework-Mongoengine का उपयोग कर सकते हैं (https://github.com/umutbozkurt/django-rest-framework-mongoengine), जो आपके मोंगोएन्गिन दस्तावेज़ों के लिए बॉक्स के बाहर धारावाहिक प्रदान करता है। –

उत्तर

6

बल्कि Serializer के restore_object में शब्दकोश क्षेत्र के साथ सौदा की तुलना में, तो आप शायद के साथ समाप्त कर देंगे थोड़ा सा क्लीनर, यदि आप इसके बजाय शब्दकोश फ़ील्ड के लिए एक कस्टम फ़ील्ड का उपयोग करते हैं, जो शब्दकोश प्रस्तुति और आंतरिक चार आधारित स्टोरेज के बीच परिवर्तित हो जाता है।

आप serializers.WritableField उपclass करना चाहते हैं और to_native() और from_native विधियों को ओवरराइड करना चाहते हैं।

Relevant docs here


नोट: संस्करण 2.x में मौजूद WritableField क्लास अब मौजूद नहीं है। यदि फ़ील्ड डेटा इनपुट का समर्थन करता है तो आपको फील्ड को उप-वर्ग करना चाहिए और to_internal_value() को ओवरराइड करना चाहिए।


अद्यतन: 3.0.4 के रूप में आप अब serializers.DictField उपयोग कर सकते हैं ... http://www.django-rest-framework.org/api-guide/fields/#dictfield

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