Django Rest框架字典字段

jav*_*ier 6 django mongodb mongoengine django-rest-framework

我使用Mongodb和mongoengine作为Django API的后端.我用来创建api的框架是Django Rest Framework.

我需要在Mongo中的字段中存储字典,并且在调用方法post时我所做的最好的是使用charfield并在函数restore_object中解析字典.

有更好的方法来实现这一目标吗?

创建一个字典字段会更好吗?我不知道这有多难.

谢谢.

编辑显示一些代码,注意我将字典存储为字典(DictField),它的内容可以从一个对象更改为其他对象.

我的mongoengine模型是这样的:

class MyDoc(mongoengine.Document):
    name = mongoengine.StringField(max_length=200)
    context = mongoengine.DictField()
Run Code Online (Sandbox Code Playgroud)

和我的序列化器类似:

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)
Run Code Online (Sandbox Code Playgroud)

Tom*_*tie 6

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