Django 无法自动保存 DateTimeFields

Posted

技术标签:

【中文标题】Django 无法自动保存 DateTimeFields【英文标题】:Django can't auto save 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 有关。

任何帮助将不胜感激。

【问题讨论】:

我只是想知道...您是否有任何理由不使用可用于DateField and DateTimeField 的 auto_now 和 auto_now_add 我读到这不是一个很好的实现:benspaulding.us/weblog/2008/aug/02/auto_now_add-evil, ***.com/questions/1737017/… 【参考方案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 docs 和 pytz 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 中

【讨论】:

以上是关于Django 无法自动保存 DateTimeFields的主要内容,如果未能解决你的问题,请参考以下文章

Django 教程:意外缩进错误

DateTimeField 的格式 [重复]

无法在 django 中保存 MultipleChoiceField

Django,在保存期间自动设置字段,基于其他管理页面输入

Django - forms.Form 无法保存当前用户并且表单有效但未保存

扩展后无法在 Django 模型上保存图像