2013-01-31 17 views
6

私はMongoengineをDjangoのAPIのバックエンドとして使用しています。 私はAPIを作成するために使用しているフレームワークはDjango Rest Frameworkです。Django Rest Framework Dictionaryフィールド

私はMongoのフィールドに辞書を格納する必要があり、メソッドpostが呼び出されたときに私がした最高のことは、charfieldを使用してrestore_object関数で辞書を解析することです。

この目標を達成するより良い方法がありますか?

dictフィールドを作成する方が良いですか?これがどれほど難しいかわかりません。

ありがとうございます。

一部のコードを表示するように編集しました。辞書を辞書(DictField)として保存していて、コンテンツがあるオブジェクトから別のオブジェクトに変更される可能性があることに注意してください。

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

など私のシリアライザ何か:

私mongoengineモデルのようなものである

シリアライザの restore_object
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

あなたはpymongoシリアライザを使うことができます - 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

よりもむしろ辞書フィールドとの契約は、おそらくになってしまいますディクショナリ表現とカスタムcharベースのストレージ間の変換を管理するカスタムフィールドをディクショナリフィールドに使用すると、ややクリーンなものになります。

serializers.WritableFieldをサブクラス化し、to_native()from_nativeのメソッドを上書きする必要があります。

Relevant docs here


注:バージョン2.xに存在するWritableFieldクラスは存在しません。フィールドがデータ入力をサポートしている場合は、Fieldをサブクラス化してto_internal_value()をオーバーライドする必要があります。


更新:3.0.4の時点で、あなたは今serializers.DictField ... http://www.django-rest-framework.org/api-guide/fields/#dictfield

関連する問題