如何解决更改 JSON 序列化对象 Django REST 框架的形状
我正在尝试更改 Django 中序列化 JSON 的结构。目前它看起来像这样:
{
"id": 1,"dates": [
{
"date": "2021-02-03","entry_id": 1,"indicator": "D"
},{
"date": "2021-02-04",{
"date": "2021-02-05","indicator": "2"
}
],},{
"id": 2,"dates": [
{
"date": "2021-02-09","entry_id": 2,"indicator": "K"
},{
"date": "2021-01-10",{
"date": "2021-01-11",{
"date": "2021-01-18","indicator": "K"
}
]
}
然而,我的目标是一个结构如下的响应:
{
"id": 1,"dates": {
"20210203": "D","20210204": "D","20210205": "2"
}
},"dates": {
"20210209": "K","20210110": "K","20210111": "K","20210118": "K"
}
}
目前我的简化模型+序列化器如下:
class Dates(models.Model):
date: date = models.DateField(verbose_name='Datum')
indicator: str = models.CharField(max_length=1,null=True,default=None,blank=True,verbose_name='Indikator')
entry: Entry = models.ForeignKey(Entry,on_delete=models.PROTECT,related_name='bookings')
class Entry(models.Model):
pass
class EntrySerializer(serializers.ModelSerializer):
dates = DateSerializer(many=True)
class Meta:
model = Entry
fields = ('id','dates',)
read_only_fields = ('id',)
class DatesSerializer(serializers.ModelSerializer):
entry_id = serializers.PrimaryKeyRelatedField(queryset=Dates.objects.all(),source='entry.id')
class Meta:
#depth = 1
model = Dates
fields = (
'date','entry_id','indicator'
)
read_only_fields = ('date','entry_id')
def create(self,validated_data):
booking = Dates.objects.create(entry=validated_data['entry']['id'],indicator=validated_data['indicator'],data=validated_data['date'])
return booking
我已尝试向日期序列化程序添加 to_representation
函数,但是我仍然得到 list
的 dicts
而不是“平面”字典。
def to_representation(self,data):
return {data.date.strftime('%Y%m%d'): data.indicator}
它可能与 many=True
标志有关,但是我不确定如何在不丢失自动将 json 序列化回对象的功能的情况下删除它。为了使 DRF 与 Datatables Editor
一起使用,需要扁平结构,因为每个日期都需要表中的某个列,由唯一名称标识,在我的情况下为 dates.YYYYmmdd
。
解决方法
您可以将日期序列化器设为方法字段并自己实现序列化:
class EntrySerializer(serializers.ModelSerializer):
dates = SerializerMethodField() # implicitly `get_dates`
def get_dates(self,instance):
return {
date.strftime('%Y%m%d'): indicator
for (date,indicator)
in instance.dates.all().values_list("date","indicator")
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。