在 models.py 中向日期字段添加 x 天数

Adding x number of days to a datefield in models.py

我正在尝试弄清楚如何将 x 天数添加到 Models.py 中的字段。我在 Stack Overflow 上阅读了很多帖子(例如这篇 )和 docs.djangoproject.com.

据我了解,最好的方法是重写保存方法。但我无法让它工作。从 MeetingSetting 我尝试从选定的日期获取一个整数。然后将此数字添加到 MeetingDataLED 中的 led_date。

这是我的 models.py

from django.db import models
from datetime import datetime, time, timedelta

# Create your models here.
class MeetingSetting(models.Model):

    class Weekdagen(models.IntegerChoices):
        MONDAY = 0
        TUESDAY = 1 
        WEDNESSDAY = 2 
        THURSDAY = 3 
        FRIDAY = 4
        SATERDAY = 5 
        SUNDAY = 6

    meeting_time_led = models.TimeField()
    meeting_time_wt = models.TimeField()
    meeting_day_led = models.IntegerField(choices=Weekdagen.choices)
    meeting_day_wt = models.IntegerField(choices=Weekdagen.choices)

class MeetingDataLED(models.Model):
    led_date = models.DateField(primary_key=True)
    led_meeting_date = models.DateField(blank=True)
    led_start_time = models.TimeField()
    led_type_of_meeting = {
        ('GBS', 'Special one'),
        ('KO', 'Special two'),
        ('NM', 'Special three'),
    }
    led_meeting_type = models.CharField(max_length=3, choices=led_type_of_meeting) 

    def save(self, *args, **kwargs):
        from datetime import datetime, timedelta
        d = timedelta(days=MeetingSetting.meeting_day_led(id=1))
        self.led_meeting_date = self.led_date() + d
        super(MeetingDataLED, self).save(*args, **kwargs)

当我转到管理页面并尝试提交一些数据时,出现以下错误: “'DeferredAttribute' 对象不可调用”

当我改变

d = timedelta(days=MeetingSetting.meeting_day_led(id=1))

d = timedelta(days=3)

我收到错误: “'datetime.date' 对象不可调用”

我不知道该怎么办。如果有人能指出正确的方向,我将不胜感激。

这里有两个问题。第一个是你不能像那样使用 .meeting_day_led(…) ,你获取对象,然后获取属性。第二个是你不应该调用self.led_date<s>()</s>,那是一个属性.因此,您可以将其重写为:

from datetime import datetime, timedelta

# …

def save(self, *args, **kwargs):
    d = timedelta(days=MeetingSetting<strong>.objects.get(id=1).meeting_day_led</strong>)
    self.led_meeting_date = <strong>self.led_date + d</strong>
    super().save(*args, **kwargs)

也就是说,对主键进行硬编码不是一个好主意:您无法保证 MeetingSetting 甚至会有这样的主键。