8

我在 Django 1.8 模型中有一个 DateField,例如:

from django.db import models
birth_date = models.DateField()

当它进入一个表单时,我得到一个“天真的”对象:

birth_date = the_form.cleaned_data['birth_date']

在调试器中打印birth_date:

ipdb> birth_date
datetime.date(2015, 6, 7)

然后,当这个东西被保存到数据库时,我会收到一个警告,正如文档所承诺的那样:

RuntimeWarning: SQLite received a naive datetime (2015-06-08 01:08:21.470719) while time zone support is active.

我已经阅读了一些关于此的 文章,但我仍然感到困惑。我应该怎么处理这个日期?

我是否应该将其转换为 DateTime,使其具有时区感知能力,然后再转换回 Date?我应该将模型设为 DateTimeField 并放弃 DateFields 吗?这里有哪些最佳实践?

4

2 回答 2

2

@kalo 的回答对我不起作用,所以我根据他的回答从最终为我工作的东西中创建了这个实用函数:

from django.utils import timezone
from django.utils.dateparse import parse_date
from django.utils.datetime_safe import time


def make_timezone_aware(date):
    return timezone.make_aware(timezone.datetime.combine(parse_date(date), time.min))

将日期与 00:00 时间相结合解决了以下错误

  • 'datetime.date' 对象没有属性 'tzinfo'
  • “str”对象没有属性“tzinfo”
于 2018-02-26T22:45:27.733 回答
0

我认为您可以尝试使用make_aware将日期转换为感知格式。来自 make_aware django 文档:

make_aware(值,时区=无,is_dst=无)

返回一个感知的日期时间,它表示与时区中的值相同的时间点,值是一个天真的日期时间。

这应该修复警告:

from django.utils import timezone

birth_date = timezone.make_aware(the_form.cleaned_data['birth_date'], timezone.get_default_timezone())
于 2015-06-09T08:53:23.110 回答