【问题标题】:Django strict checking for aware timestampsDjango 严格检查感知时间戳
【发布时间】:2021-05-06 05:29:59
【问题描述】:
在 Django 中,如果您有 USE_TZ = True 并将天真的日期时间传递给数据库调用,它会记录错误:
DateTimeField Model.field 在时区支持处于活动状态时收到一个简单的日期时间 (2021-01-01 00:00:00)。
然而,Django 使用settings.TIME_ZONE 继续执行操作。有没有办法进行更严格的检查?是否有设置让 Django 引发异常而不仅仅是记录警告?
【问题讨论】:
标签:
python
django
timezone
django-timezone
【解决方案1】:
至少从 Django 3.1 开始,没有这样的选项。
例如,DateTimeField 中的一条relevant code 如下:
def get_prep_value(self, value):
value = super().get_prep_value(value)
value = self.to_python(value)
if value is not None and settings.USE_TZ and timezone.is_naive(value):
# For backwards compatibility, interpret naive datetimes in local
# time. This won't work during DST change, but we can't do much
# about it, so we let the exceptions percolate up the call stack.
try:
name = '%s.%s' % (self.model.__name__, self.name)
except AttributeError:
name = '(unbound)'
warnings.warn("DateTimeField %s received a naive datetime (%s)"
" while time zone support is active." %
(name, value),
RuntimeWarning)
default_timezone = timezone.get_default_timezone()
value = timezone.make_aware(value, default_timezone)
return value
您可以通过创建 DateTimeField 的子类并覆盖方法 get_prep_value 和 to_python 来引发异常而不是记录警告来获得所需的行为。