我是django-rest-framework的新手,所以可以使用一些帮助。
我有一个TextField的对象,它是一个包含JSON的字符串。
我正在使用django-rest-framework将整个对象序列化为JSON。但是,这个已经是JSON的字符串被序列化为包含JSON而不是JSON本身的编码字符串。
如何告诉序列化器按原样发送此字段而不是尝试将此字符串转换为JSON?我可以使用某种“忽略”装饰器或覆盖吗?或者我可以在序列化之前预先解析这个JSON吗?
这是:
之间的区别{"data": data}
和
{"data": "data"}
后者在客户端使用更令人讨厌...
答案 0 :(得分:8)
我用另一种方式解决了这个问题:
1:对JSON内容使用JSON-Field(django-jsonfield
或django-json-field
应该没问题)。然后这些将根据需要加载/转储
2:在我的序列化程序中,使用transform-method来防止将数据作为字符串添加到响应中
class MyModelSerializer(serializers.ModelSerializer):
def transform_myjsonfield(self, obj, value):
return obj.myjsonfield
class Meta:
model = MyModel
如果您需要写访问权限,则只需添加一个转换回来的方法validate_myjsonfield
。
(当然,这也可以通过自定义DRF序列化器字段来完成。
答案 1 :(得分:3)
您可以简单地将json解码为python对象:
json_obj = json.loads(model.json_text)
序列化对象后,将此字段替换为已解码的对象:
data = serializer.data
data["field"] = json_obj
return Response(data)
答案 2 :(得分:0)
以下是对我有效的djangorestframework==3.9.1
:
import json
from rest_framework import serializers
from .models import WeatherLocation
class WeatherLocationSerializer(serializers.ModelSerializer):
LocationId = serializers.CharField(source='location_id')
City = serializers.CharField(source='city')
Region = serializers.CharField(source='region')
Name = serializers.CharField(source='name')
Country = serializers.CharField(source='country')
WeatherForecastLongTermTimePeriods = serializers.JSONField(required=False, allow_null=True,
source='weather_forecast_long_term_time_periods')
WeatherForecastShortTermTimePeriods = serializers.JSONField(required=False, allow_null=True,
source='weather_forecast_short_term_time_periods')
def to_representation(self, instance):
ret = super(WeatherLocationSerializer, self).to_representation(instance)
ret['WeatherForecastLongTermTimePeriods'] = json.loads(ret['WeatherForecastLongTermTimePeriods'])
ret['WeatherForecastShortTermTimePeriods'] = json.loads(ret['WeatherForecastShortTermTimePeriods'])
return ret
class Meta:
model = WeatherLocation
fields = ['LocationId', 'City', 'Region', 'Name', 'Country',
'WeatherForecastLongTermTimePeriods', 'WeatherForecastShortTermTimePeriods', ]
我认为这样做会更简单,但是通过更改to_representation
的行为,我可以将文本字段转换为JSON。供参考,这是我的models.py
:
from django.db import models
class WeatherLocation(models.Model):
"""
Weather app schema, from southparc
"""
location_id = models.CharField(primary_key=True, null=False, blank=False, default=None, max_length=254,
editable=True)
region = models.CharField(max_length=2, null=False, blank=False)
city = models.CharField(null=False, blank=False, max_length=254)
province = models.CharField(null=True, blank=True, max_length=254)
name = models.CharField(null=True, blank=True, max_length=254)
country = models.CharField(null=True, blank=True, max_length=254)
# JSON fields
weather_forecast_long_term_time_periods = models.TextField(default="", blank=True)
weather_forecast_short_term_time_periods = models.TextField(default="", blank=True)
# Dates
created_date = models.DateTimeField(auto_now_add=True)
modified_date = models.DateTimeField(auto_now=True)
希望有帮助。如果您使用Postgres支持的JSONField
,那么我确定您不需要这样做。我正在使用TextField在此处保存我的JSON。我认为在串行器上将字段类型指定为serializers.JSONField
就足够了,但事实并非如此。