一尘不染

Django Rest Framework和JSONField

django

给定具有JSONField的Django模型,使用Django Rest Framework对其进行序列化和反序列化的正确方法是什么?

我已经尝试过创建一个自定义serializers.WritableField和覆盖to_nativefrom_native

from json_field.fields import JSONEncoder, JSONDecoder
from rest_framework import serializers

class JSONFieldSerializer(serializers.WritableField):
    def to_native(self, obj):
    return json.dumps(obj, cls = JSONEncoder)

    def from_native(self, data):
        return json.loads(data, cls = JSONDecoder)

但是,当我尝试使用来更新模型时partial=True,JSONField对象中的所有浮点数都变为字符串。


阅读 1108

收藏
2020-03-29

共1个答案

一尘不染

如果你使用的是Django Rest Framework> = 3.3,那么现在将包含 JSONField序列化程序。现在这是正确的方法。

如果你使用的是Django Rest Framework <3.0,请参阅gzerone的答案。

如果你使用的是DRF 3.0-3.2,并且无法升级,也不需要序列化二进制数据,请按照以下说明进行操作。

首先声明一个字段类:

from rest_framework import serializers

class JSONSerializerField(serializers.Field):
    """ Serializer for JSONField -- required to make field writable"""
    def to_internal_value(self, data):
        return data
    def to_representation(self, value):
        return value

然后像这样将字段添加到模型中

class MySerializer(serializers.ModelSerializer):
    json_data = JSONSerializerField()
2020-03-29