更新Django REST框架中的SerializerMethodField

2024-10-17 00:29:34 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个序列化程序+模型,如下所示:

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

如果Entry没有为给定日期范围内的某个日期分配Date对象,我将使用SerializerMethodField创建空的“填充”日期。输出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", orderable: false, priority: 5},
        {data: "dates.20210203", orderable: false, priority: 5},
        {data: "dates.20210204", orderable: false, priority: 5},
        {data: "dates.20210205", orderable: false, priority: 5},
        {data: "dates.20210206", orderable: false, priority: 5},
        {data: "dates.20210207", orderable: false, priority: 5},
        {data: "dates.20210208", orderable: false, priority: 6},
        {data: "dates.20210209", orderable: false, priority: 6},
        {data: "dates.20210210", orderable: false, priority: 6},
        {data: "dates.20210211", orderable: false, priority: 6},
        {data: "dates.20210212", orderable: false, priority: 6},
        {data: "dates.20210213", orderable: false, priority: 6},
        {data: "dates.20210214", orderable: false, priority: 6},
        {data: "dates.20210215", orderable: false, priority: 7},
        {data: "dates.20210216", orderable: false, priority: 7},
        {data: "dates.20210217", orderable: false, priority: 7},
        {data: "dates.20210218", orderable: false, priority: 7},
        {data: "dates.20210219", orderable: false, priority: 7},
        {data: "dates.20210220", orderable: false, priority: 7},
        {data: "dates.20210221", orderable: false, priority: 7},
        {data: "dates.20210222", orderable: false, priority: 8},
        {data: "dates.20210223", orderable: false, priority: 8},
        {data: "dates.20210224", orderable: false, priority: 8},
        {data: "dates.20210225", orderable: false, priority: 8},
        {data: "dates.20210226", orderable: false, priority: 8},
        {data: "dates.20210227", orderable: false, priority: 8},
        {data: "dates.20210228", orderable: false, priority: 8},
    ]
});

Tags: nameidfalsefordatadatemodelsstart