gpt4 book ai didi

python - Django auto_now 和 auto_now_add

转载 作者:IT老高 更新时间:2023-10-28 12:11:17 26 4
gpt4 key购买 nike

对于 Django 1.1。

我的 models.py 中有这个:

class User(models.Model):
created = models.DateTimeField(auto_now_add=True)
modified = models.DateTimeField(auto_now=True)

更新一行时我得到:

[Sun Nov 15 02:18:12 2009] [error] /home/ptarjan/projects/twitter-meme/django/db/backends/mysql/base.py:84: Warning: Column 'created' cannot be null
[Sun Nov 15 02:18:12 2009] [error] return self.cursor.execute(query, args)

我的数据库的相关部分是:

  `created` datetime NOT NULL,
`modified` datetime NOT NULL,

这是否值得关注?

附带问题:在我的管理工具中,这两个字段没有显示。这是预期的吗?

最佳答案

任何带有 auto_now 的字段属性集也将继承 editable=False,因此不会显示在管理面板中。过去曾讨论过制作 auto_nowauto_now_add争论消失了,尽管它们仍然存在,但我觉得你最好使用 custom save() method .

因此,为了使其正常工作,我建议不要使用 auto_nowauto_now_add 而是定义自己的 save() 方法确保 created 仅在未设置 id 时更新(例如首次创建项目时),并让它更新 modified 每次项目的保存时间。

我用 Django 编写的其他项目也做了同样的事情,所以你的 save() 看起来像这样:

from django.utils import timezone

class User(models.Model):
created = models.DateTimeField(editable=False)
modified = models.DateTimeField()

def save(self, *args, **kwargs):
''' On save, update timestamps '''
if not self.id:
self.created = timezone.now()
self.modified = timezone.now()
return super(User, self).save(*args, **kwargs)

希望这会有所帮助!

根据评论进行编辑:

我坚持重载 save() 与依赖这些字段参数的原因有两个:

  1. 上述起起落落与其可靠性有关。这些参数在很大程度上依赖于 Django 知道如何与之交互的每种类型的数据库处理日期/时间戳字段的方式,并且似乎在每个版本之间中断和/或更改。 (我认为这是呼吁将其完全移除的动力)。
  2. 它们仅适用于 DateField、DateTimeField 和 TimeField,并且通过使用此技术,您可以在每次保存项目时自动填充任何字段类型。
  3. 使用 django.utils.timezone.now()datetime.datetime.now(),因为它会返回一个 TZ 感知或天真的 datetime.datetime 对象取决于 settings.USE_TZ

为了解决 OP 看到错误的原因,我不知道确切的原因,但看起来 created 甚至根本没有被填充,尽管有 auto_now_add=True。对我来说,它是一个错误,并强调了上面我的小列表中的第 1 项:auto_nowauto_now_add 充其量是不稳定的。

关于python - Django auto_now 和 auto_now_add,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1737017/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com