<The 1st case>:
我可以使用timezone.now(),将()
或不()
作为DateTimeField()的默认值,如下所示:
from django.utils import timezone
# Here
datetime = models.DateTimeField(default=timezone.now())
或者:
from django.utils import timezone
# Here
datetime = models.DateTimeField(default=timezone.now)
now()
和now
有什么区别?
<The 2nd case>:
我可以使用timezone.now().date()
和()
作为DateField()中的默认值,如下所示:
from django.utils import timezone
# Here
date = models.DateField(default=timezone.now().date())
但是我不能在没有()
的情况下使用timezone.now().date()
作为DateField()
中的默认值,如下所示:
from django.utils import timezone
# Error
date = models.DateField(default=timezone.now().date)
然后,我得到了下面的错误:
ValueError:Cannot serialize function<built-in method date of datetime.datetime object at 0x0000019D077B70F0>:No modulenow().date()
和now().date
有什么区别?
最后,我应该在Django模型字段中使用哪个默认值,带()
还是不带()
?
2条答案
按热度按时间nle07wnf1#
不同之处在于函数将在何时执行。Django在初始化整个应用程序时加载类的属性。假设您在2023年5月29日13:00开始托管应用程序。
现在,每次你将创建一个带有默认值为
timezone.now()
的DateTimeField
的对象,那么你将始终拥有相同的值29.05.2023在13:00,即使对象是在第二天创建的。如果你不带括号传递它,那么你传递的是函数本身,函数将在创建的时候被调用,所以它将返回对象创建的确切日期和时间。
对于第二种情况,您可能需要创建单独的函数,我认为这是因为在项目初始化期间调用的第一个函数(
now()
就在date
之前)。示例:qoefvg9y2#
简单的视觉差异是timezone.now()函数每次运行makemigrations命令时都会生成新的迁移文件,而timezone.now只会生成一次。