我有一个模型,其中有一个日期时间字段:
date = models.DateField(_("Date"), default=datetime.now())
当我在内置的django管理中检查应用时,DateField也有时间附加到它上面,所以如果你试图保存它,会返回一个错误。我如何使默认值只有日期?(datetime.today()也不工作)
DateField
datetime.today()
1sbrub3j1#
这就是为什么您应该始终导入基本datetime模块:import datetime,而不是该模块中的datetime类:from datetime import datetime .你犯的另一个错误是在默认情况下使用()来调用函数,这意味着所有的模型都将获得 * 类第一次定义时的日期 * -所以如果你的服务器几天或几周都没有重启Apache,所有的元素都将获得相同的初始日期。因此,该字段应为:
datetime
import datetime
from datetime import datetime
()
import datetime date = models.DateField(_("Date"), default=datetime.date.today)
ibrsph3r2#
您的错误是使用了datetime模块而不是date模块。您应该这样做:
date
from datetime import date date = models.DateField(_("Date"), default=date.today)
如果只想捕获当前日期,正确的处理方法是使用auto_now_add参数:
auto_now_add
date = models.DateField(_("Date"), auto_now_add=True)
然而,modelfield文档明确指出auto_now_add和auto_now将 * 始终 * 使用当前日期,并且不是可以覆盖的默认值。
auto_now
yizd12fk3#
date = models.DateTimeField(default=datetime.now, blank=True)
uqcuzwp84#
我认为解决这个问题的一个更好的方法是使用datetime可调用函数:
from datetime import datetime date = models.DateField(default=datetime.now)
注意,这里没有使用括号,如果使用括号,now()函数只会被调用一次(当模型被创建时),而是将可调用对象作为参数传递,这样每次创建模型示例时都会被调用。归功于Django Musings,我用过了,效果很好。
now()
sg24os4d5#
当对象第一次创建时自动将字段设置为现在。对于创建时间戳很有用。注意总是使用当前日期;它不仅仅是一个你可以覆盖的默认值。所以即使你在创建对象时为这个字段设置了一个值,它也会被忽略。
来源:Django文档
这应该可以达到目的:
models.DateTimeField(_("Date"), auto_now_add = True)
ru9i0ody6#
您也可以使用lambda。如果您使用www.example.com,则此命令非常有用django.utils.timezone.now
lambda
date = models.DateField(_("Date"), default=lambda: now().date())
sigwle7e7#
django提示:
提示:您似乎设置了一个固定的日期/时间/日期时间值作为此字段的默认值。这可能不是您想要的。如果您希望将当前日期作为默认值,请使用django.utils.timezone.now
django.utils.timezone.now
xnifntxz8#
我在Django4.1.7版上试过了,效果非常好!from datetime import datetime, date
from datetime import datetime, date
purchase_date = models.DateField(auto_now_add=False, auto_now=False, blank=True)
def __str__(self): return f"{self.str(purchase_date)}"返回这个字符串是完全可选的.无论你是否返回字符串都可以.
def __str__(self): return f"{self.str(purchase_date)}"
8条答案
按热度按时间1sbrub3j1#
这就是为什么您应该始终导入基本
datetime
模块:import datetime
,而不是该模块中的datetime
类:from datetime import datetime
.你犯的另一个错误是在默认情况下使用
()
来调用函数,这意味着所有的模型都将获得 * 类第一次定义时的日期 * -所以如果你的服务器几天或几周都没有重启Apache,所有的元素都将获得相同的初始日期。因此,该字段应为:
ibrsph3r2#
您的错误是使用了
datetime
模块而不是date
模块。您应该这样做:如果只想捕获当前日期,正确的处理方法是使用
auto_now_add
参数:然而,modelfield文档明确指出
auto_now_add
和auto_now
将 * 始终 * 使用当前日期,并且不是可以覆盖的默认值。yizd12fk3#
uqcuzwp84#
我认为解决这个问题的一个更好的方法是使用datetime可调用函数:
注意,这里没有使用括号,如果使用括号,
now()
函数只会被调用一次(当模型被创建时),而是将可调用对象作为参数传递,这样每次创建模型示例时都会被调用。归功于Django Musings,我用过了,效果很好。
sg24os4d5#
日期字段/DateTimeField.auto现在添加
当对象第一次创建时自动将字段设置为现在。对于创建时间戳很有用。注意总是使用当前日期;它不仅仅是一个你可以覆盖的默认值。所以即使你在创建对象时为这个字段设置了一个值,它也会被忽略。
来源:Django文档
这应该可以达到目的:
ru9i0ody6#
您也可以使用
lambda
。如果您使用www.example.com,则此命令非常有用django.utils.timezone.nowsigwle7e7#
django提示:
提示:您似乎设置了一个固定的日期/时间/日期时间值作为此字段的默认值。这可能不是您想要的。如果您希望将当前日期作为默认值,请使用
django.utils.timezone.now
xnifntxz8#
我在Django4.1.7版上试过了,效果非常好!
from datetime import datetime, date
def __str__(self): return f"{self.str(purchase_date)}"
返回这个字符串是完全可选的.无论你是否返回字符串都可以.