提问人:Super Kai - Kazuya Ito 提问时间:5/29/2023 最后编辑:Super Kai - Kazuya Ito 更新时间:6/1/2023 访问量:61
Django 模型字段中带有或不带有“()”的默认值和“ValueError:无法序列化函数”错误
The default value with or without "()" in a Django model field and "ValueError: Cannot serialize function" error
问:
<第一种情况>:
我可以在 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 模型字段中带或不带默认值?()
答:
区别在于函数何时执行。Django 在初始化整个应用程序时加载类的属性。假设您于 2023 年 5 月 29 日 13:00 开始托管您的应用程序。
现在,每次您在对象上创建默认值为 的对象时,即使对象是在第二天创建的,您也将始终在 29.05.2023 的 13:00 获得相同的值。DateTimeField
timezone.now()
如果不带括号传递它,则传递函数本身,函数将在创建时被调用,因此它将返回对象创建的确切日期和时间。
对于第二种情况,您可能需要创建单独的函数,我认为是因为在项目初始化期间调用的第一个函数(就在之前)。例:now()
date
from django.utils import timezone
def today():
return timezone.now().date
date = models.DateField(default=today)
简单的视觉区别是 timezone.now() 函数每次运行 makemigrations 命令时都会生成新的迁移文件,但 timezone.now 只会生成一次。
评论