更新 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 (将#修改为@)