【发布时间】:2021-02-04 11:48:19
【问题描述】:
我正在尝试在 Django 中更改序列化 JSON 的结构。目前它看起来像这样:
{
"id": 1,
"dates": [
{
"date": "2021-02-03",
"entry_id": 1,
"indicator": "D"
},
{
"date": "2021-02-04",
"entry_id": 1,
"indicator": "D"
},
{
"date": "2021-02-05",
"entry_id": 1,
"indicator": "2"
}
],
},
{
"id": 2,
"dates": [
{
"date": "2021-02-09",
"entry_id": 2,
"indicator": "K"
},
{
"date": "2021-01-10",
"entry_id": 2,
"indicator": "K"
},
{
"date": "2021-01-11",
"entry_id": 2,
"indicator": "K"
},
{
"date": "2021-01-18",
"entry_id": 2,
"indicator": "K"
}
]
}
但是,我的目标是做出如下结构的响应:
{
"id": 1,
"dates": {
"20210203": "D",
"20210204": "D",
"20210205": "2"
}
},
{
"id": 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 函数添加到 Dates 序列化程序,但是我仍然得到 list 的 dicts 而不是“平面”字典。
def to_representation(self, data):
return {data.date.strftime('%Y%m%d'): data.indicator}
它可能与many=True 标志有关,但是我不确定如何在不丢失自动将 json 序列化回对象的功能的情况下删除它。为了使 DRF 与 Datatables Editor 一起工作,需要扁平结构,因为每个日期都需要表中的特定列,由唯一名称标识,在我的情况下为 dates.YYYYmmdd。
【问题讨论】:
标签: python django django-rest-framework datatables