Django 模型字段中带有或不带有“()”的默认值和“ValueError:无法序列化函数”错误

The default value with or without "()" in a Django model field and "ValueError: Cannot serialize function" error

提问人:Super Kai - Kazuya Ito 提问时间:5/29/2023 最后编辑:Super Kai - Kazuya Ito 更新时间:6/1/2023 访问量:61

问:

<第一种情况>:

我可以在 DateTimeField() 中使用带或不带 timezone.now() 作为默认值,如下所示:()

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

<第二种情况>:

我可以在 DateField() 中用作默认值,如下所示:timezone.now().date()()

from django.utils import timezone
                                             # Here
date = models.DateField(default=timezone.now().date())

另外,我可以使用 without 作为默认值,如下所示,但在运行时:timezone.now().date()DateField()python manage.py makemigrations

from django.utils import timezone
                                             # Here
date = models.DateField(default=timezone.now().date)

然后,我收到以下错误:

ValueError:无法序列化函数<内置方法 datetime.datetime 对象的日期 0x0000019D077B70F0>:无模块

那么,和 之间有什么不一样?now().date()now().date

最后,总的来说,我应该使用哪个,在 Django 模型字段中带或不带默认值?()

python django 日期时间 django-models 默认

评论


答:

0赞 NixonSparrow 5/29/2023 #1

区别在于函数何时执行。Django 在初始化整个应用程序时加载类的属性。假设您于 2023 年 5 月 29 日 13:00 开始托管您的应用程序。

现在,每次您在对象上创建默认值为 的对象时,即使对象是在第二天创建的,您也将始终在 29.05.2023 的 13:00 获得相同的值。DateTimeFieldtimezone.now()

如果不带括号传递它,则传递函数本身,函数将在创建时被调用,因此它将返回对象创建的确切日期和时间。

对于第二种情况,您可能需要创建单独的函数,我认为是因为在项目初始化期间调用的第一个函数(就在之前)。例:now()date

from django.utils import timezone

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

date = models.DateField(default=today)
0赞 Darsh Modi 5/29/2023 #2

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