当我尝试通过管理员在我的两个模型中将我的日期时间字段设置为今天的日期时,我得到错误“无法在时区America / Los_Angeles中解释;它可能不明确或可能不存在”。这只发生在这两个模型中。如果我尝试在其他模型中设置日期时间到今天的日期(其中大部分未显示),则没有问题。
以下是来自model.py的相关模型:
from django.db import models
# DateTimeField has no problem with today's date in this model
class Subject(models.Model):
title = models.CharField(max_length=200, unique=True)
date_created = models.DateTimeField('date created')
times_viewed = models.IntegerField()
# Both DateTimeFields give an error in this model
class Discussion(models.Model):
subject = models.ForeignKey(Subject)
title = models.CharField(max_length=200)
version = models.CharField(max_length=200)
created = models.DateTimeField('date created')
updated = models.DateTimeField('date updated')
creator = models.CharField(max_length=200)
# DateTimeField gives an error in this model too
class DiscussionPost(models.Model):
discussion = models.ForeignKey(Discussion)
poster = models.CharField(max_length=200)
text = models.TextField()
posted = models.DateTimeField('date posted')
以下是admin.py的相关部分:
from django.contrib import admin
from my_app.models import Subject, Discussion, DiscussionPost # and other irrelevant models
class DiscussionPostInline(admin.StackedInline):
model = DiscussionPost
extra = 1
class DiscussionAdmin(admin.ModelAdmin):
fieldsets = [
('Title', {'fields': ['title']}),
('Creator', {'fields': ['creator']}),
('Date Created', {'fields': ['created']}),
('Date Updated', {'fields': ['updated']}),
]
inlines = [DiscussionPostInline]
list_display = ('title', 'creator', 'created', 'updated')
admin.site.register(Discussion, DiscussionAdmin)
DiscussionInline(admin.StackedInline):
model = Discussion
extra = 1
SubjectAdmin(admin.ModelAdmin):
fieldsets = [
(None, {'fields': ['title']}),
('Times Viewed', {'fields': ['times_viewed'], 'classes': ['collapse']}),
('Date Created', {'fields': ['date_created'], 'classes': ['collapse']}),
]
inlines = [DiscussionInline]
list_display = ('title', 'times_viewed', 'date_created')
list_filter = ['date_created']
search_fields = ['title']
date_hierarchy = 'date_created'
admin.site.register(Subject, SubjectAdmin)
如果我手动更改为与管理员不同的一天,我不会收到错误。就在我使用今天的日期时(手动和使用now())。有人知道为什么会这样吗?
此管理结构基于此Django Admin nested inline的第二个答案。
更新我在管理员中更改了日期时间,现在可以正常工作了。我没有更改模型或管理员的任何内容,所以我很难过为什么它今天早上没有工作。
答案 0 :(得分:1)
你在USE_TZ = True时混淆了天真的日期时间对象。要创建当前时间,您需要使用timezone.now()
代替datetime.now()
来自pytz doc
我们要处理的主要问题是某些日期时间可能会在一年内发生两次。 ...这意味着如果您尝试使用标准日期时间语法在“美国/东部”时区创建时间,则无法指定您是否在日终结束 - 节省时间转换之前的意思
...
最好和最简单的解决方案是坚持使用UTC。 pytz包通过在Python文档中包含基于标准Python参考实现的特殊UTC实现,鼓励使用UTC进行内部时区表示。
...
如果你将is_dst标志传递给localize(),那么如果你试图建立模糊或不存在的时间,pytz会拒绝猜测并引发异常。
解释天真的日期时间对象
当USE_TZ为True时,Django仍然接受天真的日期时间对象,以保持向后兼容性。当数据库层收到一个时,它会尝试通过在默认时区中解释它来使其知晓并发出警告。
不幸的是,在DST转换期间,某些日期时间不存在或不明确。在这种情况下,pytz引发了一个例外。其他tzinfo实现(例如,未安装pytz时用作后备的本地时区)可能引发异常或返回不准确的结果。这就是为什么在启用时区支持时应始终创建有意识的日期时间对象的原因。
在实践中,这很少是一个问题。 Django让您了解模型和表单中的日期时间对象,并且通常,新的日期时间对象是通过timedelta算法从现有对象创建的。通常在应用程序代码中创建的唯一日期时间是当前时间,timezone.now()会自动执行正确的操作。