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 中保存 MultipleChoiceField