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

更新 Django REST Framework 中的 SerializerMethodField

如何解决更新 Django REST Framework 中的 SerializerMethodField

我有一个这样的序列化器+模型:

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='dates')

class Entry(models.Model):
    pass

class EntrySerializer(serializers.ModelSerializer):
    bookings = SerializerMethodField()  # implicitly `get_dates`

    class Meta:
        model = Entry
        fields = (
            'id','dates',)
        read_only_fields = ('id',)

    def get_dates(self,instance):
        try:
            start = self.context.request.query_params.get('start')
            start = datetime.strptime(start,'%Y%m%d')
        except:
            start = None

        d = {
            date.strftime('%Y%m%d'): indicator
            for (date,indicator)
            in instance.dates.all().values_list("date","indicator")
        }

        dates = date_range(start) # just returns a list of dates
        for date in dates: d.setdefault(date.strftime('%Y%m%d'),'')

        return d

如果 SerializerMethodField 没有为给定日期范围内的某个日期分配 Entry 对象,我正在使用 Date 创建空的“填充”日期。输出 JSON 如下所示:

[
    {
        "id": 1,"bookings": {
            "20210203": "D",# actual `Date` for `Entry` object
            "20210204": "D",# actual `Date` for `Entry` object
            "20210205": "2",# actual `Date` for `Entry` object
            "20210201": "",# padding dates until the end,because
            "20210202": "",# [...] the `Entry` does not yet have an
            "20210206": "",# [...] associated `Date` for that date yet
            "20210207": "","20210208": "","20210209": "","20210210": "","20210211": "","20210212": "","20210213": "","20210214": "","20210215": "","20210216": "","20210217": "","20210218": "","20210219": "","20210220": "","20210221": "","20210222": "","20210223": "","20210224": "","20210225": "","20210226": "","20210227": "","20210228": ""
        },},...
]

当在其中一个日期上设置相应的值时,我现在尝试实际创建一个 Date 对象。同样更新,如果其中一个值在已经存在的 Date 上发生变化。

知道如何做到这一点吗?不幸的是,结构必须如此扁平,因为 Datatables Editor 不能用于列表嵌套对象。


对 DataTables 结构的澄清导致我不得不添加空的填充日期:

var table = $('#plan').DataTable({
    ajax: {
        url: "/api/entries/?format=datatables",rowId: 'id',order: [[0,'asc']],columns: [
        {
            data: 'order',className: 'reorder',{data: "entry.id"},{data: "dates.20210201",orderable: false,priority: 5},{data: "dates.20210202",{data: "dates.20210203",{data: "dates.20210204",{data: "dates.20210205",{data: "dates.20210206",{data: "dates.20210207",{data: "dates.20210208",priority: 6},{data: "dates.20210209",{data: "dates.20210210",{data: "dates.20210211",{data: "dates.20210212",{data: "dates.20210213",{data: "dates.20210214",{data: "dates.20210215",priority: 7},{data: "dates.20210216",{data: "dates.20210217",{data: "dates.20210218",{data: "dates.20210219",{data: "dates.20210220",{data: "dates.20210221",{data: "dates.20210222",priority: 8},{data: "dates.20210223",{data: "dates.20210224",{data: "dates.20210225",{data: "dates.20210226",{data: "dates.20210227",{data: "dates.20210228",]
});

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。