Django Rest框架和JSONField [英] Django Rest Framework and JSONField

查看:541
本文介绍了Django Rest框架和JSONField的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

给出使用 JSONField 的Django模型,使用 Django Rest Framework



我已经尝试了一个自定义的 serializers.WritableField 并覆盖 to_native from_native

 $ j $ _ code从json_field.fields导入JSONEncoder,JSONDecoder 
从rest_framework导入序列化程序

类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对象中的所有浮点变为字符串。

解决方案

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



如果您使用Django Rest Framework< 3.0,然后参见gzerone的答案。



如果您使用的是DRF 3.0 - 3.2,并且无法升级,则不需要序列化二进制数据,然后按照这些说明。



首先声明一个字段类:

  from rest_framework import serializer 

class JSONSerializerField(serializers.Field):
JSONField的串行器 - 需要使字段可写
def to_internal_value(self,data):
返回数据
def to_representation(self,value):
返回值

然后将字段添加到模型中,如

  class MySerializer(serializers.ModelSerializer):
json_data = JSONSerializerField()

而且,如果您需要序列化二进制数据, a href =https://github.com/tomchristie/django-rest-framework/commit/10dbf1316f9092dbd751b1e47fbcab45576ca8fc#diff-af402f515 db75c7c6754453cf15455d9R1526>正式发行代码


Given a Django model with a JSONField, what is the correct way of serializing and deserializing it using Django Rest Framework?

I've already tried crating a custom serializers.WritableField and overriding to_native and 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)

But when I try to updating the model using partial=True, all the floats in the JSONField objects become strings.

解决方案

If you're using Django Rest Framework >= 3.3, then the JSONField serializer is now included. This is now the correct way.

If you're using Django Rest Framework < 3.0, then see gzerone's answer.

If you're using DRF 3.0 - 3.2 AND you can't upgrade AND you don't need to serialize binary data, then follow these instructions.

First declare a field class:

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

And then add in the field into the model like

class MySerializer(serializers.ModelSerializer):
    json_data = JSONSerializerField()

And, if you do need to serialize binary data, you can always the copy official release code

这篇关于Django Rest框架和JSONField的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆