如何将Django模型日期字段的默认值设置为未来的日期?

8

我试图将一个日期字段的默认值设置为相对于今天的未来日期。然而,当我按照以下所示进行设置时,它会给我以下警告。

return_date = models.DateField(default=(timezone.now() + timedelta(days=1)))

booking.Booking.return_date: (fields.W161) Fixed default value provided.
HINT: It seems you set a fixed date / time / datetime value as default for 
this field. This may not be what you want. If you want to have the 
current date as default, use `django.utils.timezone.now`

同样的警告会出现在以下代码中。
return_date = models.DateField(default=(date.today() + timedelta(days=1)))

什么是正确的方法?谢谢。
2个回答

13
你正在指定一个固定的时间(因为你调用了timezone.now()函数,所以它返回了默认值),你应该将函数传递给默认值而不是调用它,像这样:
def return_date_time():
    now = timezone.now()
    return now + timedelta(days=1)

在你的领域中:

return_date = models.DateField(default=return_date_time) 
### dont call it, so it will be evaluated by djanog when creating an instance

0
尝试使用datetime.date而不是添加到timezone.now。
以下是来自Django docs的摘录 DateField class DateField(auto_now=False, auto_now_add=False, **options) 日期,由datetime.date实例在Python中表示。有一些额外的可选参数: DateField.auto_now 每次保存对象时自动将字段设置为当前时间。对于“最后修改”时间戳非常有用。请注意,始终使用当前日期;它不仅仅是您可以覆盖的默认值。
只有在调用Model.save()时才会自动更新该字段。当以其他方式更新其他字段(例如QuerySet.update())时,该字段不会更新,尽管您可以在此类更新中为该字段指定自定义值。

DateField.auto_now_add 自动设置字段为当前时间,用于创建时间戳非常有用。请注意,始终使用当前日期;它不仅仅是一个可以覆盖的默认值。因此,即使在创建对象时为此字段设置了值,也将被忽略。如果您想要能够修改此字段,请设置以下内容而不是auto_now_add=True:

对于DateField:default=date.today - 来自datetime.date.today() 对于DateTimeField:default=timezone.now - 来自django.utils.timezone.now() 此字段的默认表单小部件为TextInput。管理员会添加JavaScript日历以及“今天”的快捷方式。包括一个额外的invalid_date错误消息键。

选项auto_now_add、auto_now和default是互斥的。任何这些选项的组合都会导致错误。


这是我在第二段代码片段中提到的同样的警告。 - Indika Rajapaksha

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接