6

DjangoのAPIのバックエンドとしてmongoengineでMongodbを使用しています。API の作成に使用しているフレームワークは Django Rest Framework です。

Mongo のフィールドにディクショナリを格納する必要があります。メソッド post が呼び出されたときに行った最善の方法は、charfield を使用して関数 restore_object でディクショナリを解析することです。

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

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

ありがとうございました。

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

私のmongoengineモデルは次のようなものです:

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

そして私のシリアライザは次のようなものです:

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)
4

1 に答える 1

7

シリアライザーの でディクショナリ フィールドを処理するのではなく、ディクショナリ フィールドにrestore_objectカスタム フィールドを使用すると、おそらく少しきれいになります。

およびメソッドをサブクラス化serializers.WritableFieldし、オーバーライドする必要があります。to_native()from_native

関連ドキュメントはこちら


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


更新: 3.0.4 の時点で使用できるようになりましたserializers.DictField... http://www.django-rest-framework.org/api-guide/fields/#dictfield

于 2013-02-01T11:00:28.597 に答える