如何设置默认日期字段并覆盖它以及设置默认默认日期时间字段并覆盖它,全部在同一个 models.py
How to set default datefield and overwrite it as well as set default default datetimefield and overwrite it, all in the same models.py
我的两个模型有日期字段和日期时间字段。它们存在于同一个 models.py 文件中,我想在添加到数据库/存在时将它们设置为默认值。更重要的是,我还想覆盖这些字段以生成模型来测试它们。
经过一些研究,我开始使用 pytz 和 django.utils 时区。当我尝试使用 python 的内置日期时间(使用 timedelta 等)覆盖它们时,我 运行 遇到的问题是 运行 时间错误。所以我尝试转换 pytz.utc.localize(),但它抱怨我提供给它的 datetime 对象并不天真,但是当我回到我的原始版本时,它仍然抛出运行时错误。我找到了很多方法来解决这个问题,主要是使用需要 import datetime
的 date = models.DateField(_("Date"), default=datetime.date.today)
,但这里的问题是我还想使用 DateTimeField,现在只使用 DateField。所以我会使用 date = models.DateField(_("Date"), default=date.today)
,但这需要 from datetime import date
。导入冲突,整件事都让我很困惑
class SomeTime(models.Model):
moment = models.DateTimeField(default=???, editable=True, blank=True)
class SomeDay(models.Model):
date = models.DateField(default=???, editable=True, blank=True)
我想去
m = SomeTime()
m.moment = #some datetime that I set, It should not throw a runtime error
m.save()
d = SomeDay()
d.date = #some date that I set, It should not throw a runtime error
d.save()
除了简单地创建这些对象,SomeTime 还必须将当前日期时间保存到 moment,而 SomeDay 必须保存当前日期
您需要先导入日期时间。
import datetime
然后根据您的代码。
now = datetime.datetime.now()
m = SomeTime()
m.moment = now
m.save()
d = SomeDay()
d.date = now.date()
d.save()
你发现了根本没有的问题。如果您需要同时导入日期时间和日期,那么就这样做。或者更好的是,导入 datetime 模块并访问其中的两个 类。
import datetime
class SomeTime(models.Model):
moment = models.DateTimeField(default=datetime.datetime.now, editable=True, blank=True)
class SomeDay(models.Model):
date = models.DateField(default=datetime.date.today, editable=True, blank=True)
或者,如果您愿意,可以执行 from datetime.import datetime, date
然后 default=datetime.now
和 default=date.today
。
models.DateTimeField 使用:
from django.utils.dateparse import parse_datetime
# set default date
default_date = parse_datetime('2000-01-01T00:00:00')
class SomeTime(models.Model):
date = models.DateTimeField(default=default_date)
您可以更新此字段:
from django.utils.timezone import now
filtered_sometime.update(date = now)
# with usage of time delta
filtered_sometime.update(date = now() + relativedelta(months=-1))
要删除运行时警告,您可以转到 settings.py 并注释掉 "USE_TZ = True"。这只是一个临时解决方案,我们希望在考虑国际使用的同时找到一种完全避免运行时错误的方法
我的两个模型有日期字段和日期时间字段。它们存在于同一个 models.py 文件中,我想在添加到数据库/存在时将它们设置为默认值。更重要的是,我还想覆盖这些字段以生成模型来测试它们。
经过一些研究,我开始使用 pytz 和 django.utils 时区。当我尝试使用 python 的内置日期时间(使用 timedelta 等)覆盖它们时,我 运行 遇到的问题是 运行 时间错误。所以我尝试转换 pytz.utc.localize(),但它抱怨我提供给它的 datetime 对象并不天真,但是当我回到我的原始版本时,它仍然抛出运行时错误。我找到了很多方法来解决这个问题,主要是使用需要 import datetime
的 date = models.DateField(_("Date"), default=datetime.date.today)
,但这里的问题是我还想使用 DateTimeField,现在只使用 DateField。所以我会使用 date = models.DateField(_("Date"), default=date.today)
,但这需要 from datetime import date
。导入冲突,整件事都让我很困惑
class SomeTime(models.Model):
moment = models.DateTimeField(default=???, editable=True, blank=True)
class SomeDay(models.Model):
date = models.DateField(default=???, editable=True, blank=True)
我想去
m = SomeTime()
m.moment = #some datetime that I set, It should not throw a runtime error
m.save()
d = SomeDay()
d.date = #some date that I set, It should not throw a runtime error
d.save()
除了简单地创建这些对象,SomeTime 还必须将当前日期时间保存到 moment,而 SomeDay 必须保存当前日期
您需要先导入日期时间。
import datetime
然后根据您的代码。
now = datetime.datetime.now()
m = SomeTime()
m.moment = now
m.save()
d = SomeDay()
d.date = now.date()
d.save()
你发现了根本没有的问题。如果您需要同时导入日期时间和日期,那么就这样做。或者更好的是,导入 datetime 模块并访问其中的两个 类。
import datetime
class SomeTime(models.Model):
moment = models.DateTimeField(default=datetime.datetime.now, editable=True, blank=True)
class SomeDay(models.Model):
date = models.DateField(default=datetime.date.today, editable=True, blank=True)
或者,如果您愿意,可以执行 from datetime.import datetime, date
然后 default=datetime.now
和 default=date.today
。
models.DateTimeField 使用:
from django.utils.dateparse import parse_datetime
# set default date
default_date = parse_datetime('2000-01-01T00:00:00')
class SomeTime(models.Model):
date = models.DateTimeField(default=default_date)
您可以更新此字段:
from django.utils.timezone import now
filtered_sometime.update(date = now)
# with usage of time delta
filtered_sometime.update(date = now() + relativedelta(months=-1))
要删除运行时警告,您可以转到 settings.py 并注释掉 "USE_TZ = True"。这只是一个临时解决方案,我们希望在考虑国际使用的同时找到一种完全避免运行时错误的方法