2013-01-31 32 views
6

Mongodb'u Django'da bir API için arka uç olarak mongoengine ile kullanıyorum. API oluşturmak için kullandığım çerçeve Django Rest Framework'dür.Django Rest Framework Sözlük Alanı

Mongo'da bir alanda bir sözlük saklamam gerekiyor ve yöntem gönderimi çağrıldığında yaptığım en iyi şey bir charfield kullanmak ve restore_object işlevindeki sözlüğü ayrıştırmaktır.

Bu hedefe ulaşmak için daha iyi bir yol var mı?

Bir dict alanı oluşturmak daha mı iyi? Bunun ne kadar zor olabileceğini bilmiyorum.

Teşekkür ederiz. Bazı kodları gösterecek şekilde düzenlenmiş, sözlüğü bir dict (DictField) olarak sakladığımı ve içeriğin bir nesneden diğerine değişebileceğine dikkat edin.

benim mongoengine modelidir gibi bir şey:

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

ve benzeri benim serileştirici şey:

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

http://www.django-rest-framework.org/api-guide/fields/#dictfield Eğer belge tanımları ve bazı kod sonrası olabilir? Ben faydalı olacağını düşünüyorum – dm03514

+0

Sen pymongo serileştiriciler kullanabilirsiniz - bkz: http://api.mongodb.org/python/current/api/bson/json_util.html – Ross

+0

2016 yılında Django-REST-Framework-Mongoengine kullanabilirsiniz (https://github.com/umutbozkurt/django-rest-framework-mongoengine), Mongoengine Belgeleriniz için serileştiriciler sağlayan kutudan çıktı. –

cevap

6

Aksine Serializer en restore_object yılında sözlük alanla mücadele etmek yerine, muhtemelen ile bitireceğiz biraz daha temiz bir şey, bunun yerine sözlük alanı için özel bir alan kullanırsanız, sözlük temsili ile dahili char tabanlı depolamayı dönüştürür.

serializers.WritableField'u alt sınıflara ayırmak ve to_native() ve from_native yöntemlerini geçersiz kılmak istersiniz.

Relevant docs here. Not: 2.x sürümünde bulunan WritableField sınıfı artık mevcut değil. Alan alt sınıfı girmeli ve alan veri girişini destekliyorsa, to_internal_value() değerini geçersiz kılmalısınız.


Güncelleme: 3.0.4 itibariyle artık serializers.DictField kullanabilirsiniz ...

İlgili konular