微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决更改 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 函数,但是我仍然得到 listdicts 而不是“平面”字典。

    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 举报,一经查实,本站将立刻删除。