6

我正在使用带有 mongoengine 的 Mongodb 作为 Django 中 API 的后端。我用来创建 api 的框架是 Django Rest Framework。

我需要在 Mongo 的一个字段中存储一个字典,当调用 post 方法时我所做的最好的事情是使用一个字符字段并在函数 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()andfrom_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 回答