如何使用 timedelta 和 timezone.now 作为默认值?

raj*_*alx 4 python django django-models

在 Django 模型中,如何使用timezone.now?

在职的:

end_date = models.DateTimeField(default=timezone.now() + timezone.timedelta(days=365))
Run Code Online (Sandbox Code Playgroud)

不工作

end_date = models.DateTimeField(default=timezone.now + timezone.timedelta(days=365))
Run Code Online (Sandbox Code Playgroud)

我认为timezone.now是一个每次创建对象时都会运行的函数。从而发生错误。

Mos*_*oye 5

你可以使用一个函数:

def f():
   return timezone.now() + timezone.timedelta(days=365)
...
end_date = models.DateTimeField(default=f)
Run Code Online (Sandbox Code Playgroud)

该时区中的当前时间end_date是在默认情况下创建新时区时添加的时间增量:

>>> from django.utils import timezone
>>> from datetime import timedelta
>>> def f():
...    return timezone.now() + timezone.timedelta(days=365)
... 
>>> f()
datetime.datetime(2018, 6, 25, 19, 42, 49, 761389, tzinfo=<UTC>)
>>> f()
datetime.datetime(2018, 6, 25, 19, 43, 2, 953158, tzinfo=<UTC>)
Run Code Online (Sandbox Code Playgroud)

使用 Django 运行示例:

In [1]: from testapp import models

In [2]: models.Test.objects.create().date_added
Out[2]: datetime.datetime(2018, 6, 25, 20, 5, 28, 316214, tzinfo=<UTC>)

In [3]: models.Test.objects.create().date_added
Out[3]: datetime.datetime(2018, 6, 25, 20, 5, 33, 114624, tzinfo=<UTC>)
Run Code Online (Sandbox Code Playgroud)