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

Posted

技术标签:

【中文标题】为啥 django-lint 告诉我 `auto_now_add` 已弃用?【英文标题】:Why does django-lint tell me the `auto_now_add` is deprecated?为什么 django-lint 告诉我 `auto_now_add` 已弃用? 【发布时间】:2012-04-29 00:23:30 【问题描述】:

大家好 Djangonauts:

我使用 django-lint 检查了我的项目,结果如下:

W:211,16:MyModel: timestamp: Uses superceded auto_now or auto_now_add

commit message:

auto_now/auto_now_add not technically deprecated, but they still suck.

为什么他们说 auto_now/auto_now_add “糟透了”?使用这两个字段参数实现 created/last-updated 模式没有问题。

这种模式有更好的方法吗?自定义字段类?为什么(如果这种方法更好)它没有被集成到 Django 中?

【问题讨论】:

【参考方案1】:

正确的解决方法是将可调用对象作为字段的default 传递,以返回适当的日期时间,例如datetime.datetime.now.

【讨论】:

可以说auto_now_add=Truedefault=datetime.now(), editable=False, blank=True 的快捷方式。但是如何实现auto_now=True 覆盖save() 方法,并将其设置在那里。 另外,default=datetime.now 哎呀...括号溜走了 :) 关于 save 方法,我认为对于这种常见的模式手动包含太多样板。【参考方案2】:

auto_nowauto_now_add 被认为是有害的,因为您绝对无法通过 django 更改值(例如,在管理界面中)。

这与其他标志不一致,django 人通常不喜欢这种魔法。

【讨论】:

反映创建时间(或上次修改时间)的字段对我来说在管理员中可编辑没有多大意义。 有时你想伪造一些东西。考虑备份及其恢复。 我刚刚确信我不想使用 DjangoLint。如果 auto_add 和 auto_add_new 存在实际缺陷,则应该修复它们。但这里不是这样。因为不符合您的个人要求而认为您不需要使用的东西是坏的,这是狭隘和短视的。不要使用它,不要认为你了解其他人的要求。对很多人来说,不能轻易更改值的事实是一个特性,而不是一个错误。有些人碰巧不喜欢的东西不属于 Lint 程序。 @roy-leban 这不仅仅是一个人的个人要求,long 被认为是一种反模式:code.djangoproject.com/ticket/22995 @TomCarrick 刚刚看到这个旧评论。广泛持有的观点仍然是一种观点。您链接的页面讨论了完成同一件事的其他方法,以及这些方法是否应该取代这些方法。这根本不会使它成为反模式。它使它成为人们使用和喜欢的模式,并且正在讨论最好的方法。鉴于 auto_now 和 auto_now_add 可能已在数十万个地方使用,因此因为有些人不喜欢它们而弃用它们并不是一个好主意。有人说删除它们会帮助人们学习重要的 API 的评论是愚蠢的。

以上是关于为啥 django-lint 告诉我 `auto_now_add` 已弃用?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我不能准备这个 sql 语句来设置 auto_increment?

这里的#auto 属性是啥以及为啥需要它

为啥 margin:auto 不工作?

为啥将“margin:0 auto”添加到滑块菜单会破坏它?

为啥这个 CSS 示例使用“height: 1%”和“overflow: auto”?

为啥在 col-auto 内具有多列的嵌套行的大小大于内容宽度?