python-Django Rest框架和JSONField
给定具有JSONField的Django模型,使用Django Rest Framework对其进行序列化和反序列化的正确方法是什么?
我已经尝试创建自定义partial=True并覆盖to_native和from_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对象中的所有浮点数都变为字符串。
11个解决方案
62 votes
如果您使用的是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()
而且,如果您确实需要序列化二进制数据,则始终可以复制正式发布代码
Mark Chackerian answered 2020-02-03T08:47:39Z
18 votes
在2.4.x中:
from rest_framework import serializers # get from https://gist.github.com/rouge8/5445149