在Django模型字段中有或没有“()”和“ValueError:无法序列化函数”错误

8wtpewkr  于 2023-05-30  发布在  Go
关注(0)|答案(2)|浏览(112)

<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 module
now().date()now().date有什么区别?
最后,我应该在Django模型字段中使用哪个默认值,带()还是不带()

nle07wnf

nle07wnf1#

不同之处在于函数将在何时执行。Django在初始化整个应用程序时加载类的属性。假设您在2023年5月29日13:00开始托管应用程序。
现在,每次你将创建一个带有默认值为timezone.now()DateTimeField的对象,那么你将始终拥有相同的值29.05.2023在13:00,即使对象是在第二天创建的。
如果你不带括号传递它,那么你传递的是函数本身,函数将在创建的时候被调用,所以它将返回对象创建的确切日期和时间。
对于第二种情况,您可能需要创建单独的函数,我认为这是因为在项目初始化期间调用的第一个函数(now()就在date之前)。示例:

from django.utils import timezone

def today():
    return timezone.now().date

date = models.DateField(default=today)
qoefvg9y

qoefvg9y2#

简单的视觉差异是timezone.now()函数每次运行makemigrations命令时都会生成新的迁移文件,而timezone.now只会生成一次。

相关问题