启用了 auto_now_add 选项的 DateTimeField 是不是必须在夹具中具有值

Posted

技术标签:

【中文标题】启用了 auto_now_add 选项的 DateTimeField 是不是必须在夹具中具有值【英文标题】:Is DateTimeField with auto_now_add option enabled must has value in fixtures启用了 auto_now_add 选项的 DateTimeField 是否必须在夹具中具有值 【发布时间】:2012-07-14 18:00:36 【问题描述】:

我的模型创建字段配置如下:

created = models.DateTimeField(auto_now_add=True)

在 JSON 固定装置中,我不想为 created 声明值,但是当我尝试加载固定装置 (loadata) 时出现错误:

created 不能为 NULL

所以我必须在夹具中提供创造价值还是有其他方式?

【问题讨论】:

【参考方案1】:

您可以使用 pre_save 信号来处理 loaddata(fixtures)

def pre_save_for_conference_code_fixture(sender, instance, **kwargs):
  if kwargs['raw']:
    instance.updated_at = timezone.now()
      if not instance.id:
        instance.created_at = timezone.now()

https://docs.djangoproject.com/en/3.1/ref/django-admin/#django-admin-loaddata

【讨论】:

【参考方案2】:

试试

import datetime
created = models.DateTimeField(default=datetime.datetime.now)

关于为什么会发生这种情况,您可以在这里阅读:Django auto_now and auto_now_add 和 Django model field default

【讨论】:

这是一个糟糕的建议。 datetime.datetime.now() 将在模型加载时进行评估。这个创建字段的默认日期时间基本上是服务器上次启动的时间。编辑:这就是 oburejin 真正想要的。 created = models.DateTimeField(default=datetime.datetime.now) (默认采用可调用对象,用于在实际实例化时间调用。参见:docs.djangoproject.com/en/dev/ref/models/fields/#default) 作为参考,最好使用 django.utils 的 timezone 函数,因为它处理时区。否则你会收到警告。 (见:***.com/questions/18622007/…)

以上是关于启用了 auto_now_add 选项的 DateTimeField 是不是必须在夹具中具有值的主要内容,如果未能解决你的问题,请参考以下文章

django 时区如何与 model.field 的 auto_now_add 一起使用

如何从 dev.jtsage 正确启用 beforeToday DateBox 选项

django model:auto_now_add 和 auto_now

Django中的日期和时间DateField.auto_nowDateField.auto_now_add

ORM的使用

为啥 django-lint 告诉我 `auto_now_add` 已弃用?