Python 更改JSON序列化对象Django REST框架的形状
我试图在Django中更改序列化JSON的结构。现在看起来是这样的:Python 更改JSON序列化对象Django REST框架的形状,python,django,django-rest-framework,datatables,Python,Django,Django Rest Framework,Datatables,我试图在Django中更改序列化JSON的结构。现在看起来是这样的: { “id”:1, “日期”:[ { “日期”:“2021-02-03”, “入口id”:1, “指标”:“D” }, { “日期”:“2021-02-04”, “入口id”:1, “指标”:“D” }, { “日期”:“2021-02-05”, “入口id”:1, “指标”:“2” } ], }, { “id”:2, “日期”:[ { “日期”:“2021-02-09”, “入口id”:2, “指标”:“K” }, { “日
{
“id”:1,
“日期”:[
{
“日期”:“2021-02-03”,
“入口id”:1,
“指标”:“D”
},
{
“日期”:“2021-02-04”,
“入口id”:1,
“指标”:“D”
},
{
“日期”:“2021-02-05”,
“入口id”:1,
“指标”:“2”
}
],
},
{
“id”:2,
“日期”:[
{
“日期”:“2021-02-09”,
“入口id”:2,
“指标”:“K”
},
{
“日期”:“2021-01-10”,
“入口id”:2,
“指标”:“K”
},
{
“日期”:“2021-01-11”,
“入口id”:2,
“指标”:“K”
},
{
“日期”:“2021-01-18”,
“入口id”:2,
“指标”:“K”
}
]
}
然而,我的目标是做出如下结构的回应:
{
“id”:1,
“日期”:{
“20210203”:“D”,
“20210204”:“D”,
"20210205": "2"
}
},
{
“id”:2,
“日期”:{
“20210209”:“K”,
“20210110”:“K”,
“20210111”:“K”,
“20210118”:“K”
}
}
目前我的简化模型+序列化程序如下:
上课日期(models.Model):
日期:date=models.DateField(verbose_name='Datum')
指示符: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')
类条目(models.Model):
通过
类EntrySerializer(serializers.ModelSerializer):
dates=DateSerializer(many=True)
类元:
模型=输入
字段=('id','dates',)
只读字段=('id',)
类DatesSerializer(serializers.ModelSerializer):
entry\u id=serializers.PrimaryKeyRelatedField(queryset=Dates.objects.all(),source='entry.id')
类元:
#深度=1
型号=日期
字段=(
“日期”、“条目id”、“指标”
)
只读字段=('date','entry\u id')
def创建(自我验证的_数据):
booking=Dates.objects.create(entry=validated_data['entry']['id'],
指标=已验证的_数据['indicator'],
数据=已验证的数据['date'])
回程订票
我已经尝试将一个to_representation
函数添加到日期序列化程序中,但是我仍然得到一个dicts的列表,而不是一个“扁平”dicts
def to_表示法(自身、数据):
返回{data.date.strftime(“%Y%m%d”):data.indicator}
它可能与many=True
标志有关,但是我不确定如何删除它而不丢失自动将json序列化回对象的功能。为了使DRF与数据表编辑器
一起工作,需要平面结构,因为在我的例子中,每个日期都需要表中的某一列,由唯一的名称标识。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")
}
这很好用——我印象深刻。这是否也可以将JSON反序列化回对象,以更新或创建给定条目的日期模型?SerializerMethodFields始终是只读的,因此在这种情况下,您需要在序列化程序上使用自定义的update()
方法(可能会将其重构为to_representation())
和日期
将被标记为DictField
或类似内容)。因此,如果我了解是否有两种处理方法正确-视图上的自定义更新()
方法或另一个序列化程序
日期
使用?我不能简单地在已经存在的序列化上使用get_dates
和update_dates
。有很多方法可以处理它…:-)更新(或创建)方法将位于条目序列化程序上;由于存在一个日期集合而不是单个日期,因此无法将该方法放在DateSerializer上。更新/创建方法将使用输入数据中的dict,并创建或更新附加到(可能是新创建的)条目对象的日期对象。快速跟进问题–是否也可以将原始条目的值传递给SerializerMethodField
?原因是我正在查询具有特定时间段(开始:日期
和结束:日期
)的条目
),如果条目
在该时间段中没有相应的日期对象
,则必须添加空的“填充”日期。编辑:还是有更好的方法完全解决这个问题?