【问题标题】:Django can't auto save DateTimeFieldsDjango 无法自动保存 DateTimeFields
【发布时间】:2012-10-21 09:51:49
【问题描述】:

您好,我有一个这样的模型:

from datetime import datetime


class Project(models.Model):
    created = models.DateTimeField(editable=False)
    updated = models.DateTimeField(editable=False)
    product = models.ForeignKey('tool.product')
    module = models.ForeignKey('tool.module')
    model = models.ForeignKey('tool.model')
    zipcode = models.IntegerField(max_length=5)

    def save(self, **kwargs):
        if not self.id:
            self.created = datetime.now()
        self.updated = datetime.now()
        super(Project, self).save()

    def __unicode__(self):
        return self.id

但是,当我尝试保存项目时,我得到:

coercing to Unicode: need string or buffer, long found

从运行服务器:

RuntimeWarning: DateTimeField received a naive datetime (2012-10-31 14:45:36.611622) while time zone support is active.

我不确定到底是什么问题,但我假设它与timezone 妨碍保存DateTimeField 有关。

任何帮助将不胜感激。

【问题讨论】:

标签: django django-models django-admin


【解决方案1】:

首先 DateTimeField 支持这样的自动更新:

created = models.DateTimeField(editable=False, auto_now_add=True) # Only on creation
updated = models.DateTimeField(editable=False, auto_now=True)     # On every save

其次,你得到的 RuntimeWarning,意味着你已经在你的 settings.py 时区感知日期时间对象,例如,您将看到以下内容:

USE_TZ = True

当你这样做时,你必须区别对待日期时间对象,你必须通过 明确的 tzinfo 值。

# install the `pytz` module through pip or whatnot
from pytz import timezone
import datetime
from django.utils.timezone import utc

now = datetime.datetime.utcnow().replace(tzinfo=utc)

# To show the time in Greece
athens = timezone('Europe/Athens')
print now.astimezone(athens)

有关详细信息,请参阅 django docspytz docs

关于coercing to Unicode: 错误,请尝试这样做:

def __unicode__(self):
    return unicode(self.id)

【讨论】:

  • 有什么方法可以启用 TZ 以及自动保存功能吗?
  • 或者如果我禁用了 TZ 会有问题吗?
  • 我的意思是,如果您查看 settings.py,那么 USE_TZ 将为 True。但是,当您使用 datetime 对象进行操作时,您不会使用时区。这就是 django 唠叨你的原因。
  • @DarwinTech 这取决于你想做什么。我总是使用时区感知日期。我会更新我的帖子。
  • 所以我将模型更改为auto_save,但我仍然收到 unicode 错误。
【解决方案2】:

我在创建时存储now 的方法是使用DateTimeField 的default 属性和Django's now() wrapper,如下所示:

from django.utils import timezone

ctime = models.DateTimeField(default=timezone.now)

请注意,此日期是 UTC 时区,如果您需要设置其他时区,请将 timezone.now 包装在调用 localtime() 的 lambda 中

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多