Python 更改JSON序列化对象Django REST框架的形状

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” }, { “日

我试图在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”
},
{
“日期”:“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
?原因是我正在查询具有特定时间段(
开始:日期
结束:日期
)的
条目
),如果
条目
在该时间段中没有相应的
日期对象
,则必须添加空的“填充”日期。编辑:还是有更好的方法完全解决这个问题?