【问题标题】:Django Rest Framework Dictionary FieldDjango Rest Framework 字典字段
【发布时间】:2013-01-15 15:26:17
【问题描述】:

我在 Django 中使用 Mongodb 和 mongoengine 作为 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)

【问题讨论】:

标签: django mongodb mongoengine django-rest-framework


【解决方案1】:

而不是处理序列化程序的restore_object 中的字典字段,如果您使用字典字段的自定义字段来管理字典表示和内部字符之间的转换,您最终可能会得到一些更干净的东西基于存储。

您需要继承 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

【讨论】:

    猜你喜欢
    • 2021-09-03
    • 2017-08-29
    • 2015-09-19
    • 1970-01-01
    • 1970-01-01
    • 2016-09-18
    • 1970-01-01
    • 2018-10-03
    • 2018-08-07
    相关资源
    最近更新 更多