【发布时间】:2016-04-29 02:33:44
【问题描述】:
我开始从事一个用 Django 构建的项目,但我想不通。
我的 settings.py 中有:
TIME_ZONE = 'UTC'
USE_I18N = True
USE_L10N = True
USE_TZ = True
在我的 models.py 中,我有这样的日期字段:
#...
date = models.DateTimeField(default=timezone.now)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
#...
我的网址在 urls.py 中是这样定义的:
urlpatterns = patterns(
'',
url(r'^api/catalog/', include('catalog.urls')),
url(r'^api/logs/', include('logs.urls')),
url(r'^admin/', include(admin.site.urls)),
)
在目录/urls.py 中:
router = DefaultRouter(trailing_slash=False)
router.register(r'users', UserViewSet)
# ...
projects_router = NestedSimpleRouter(router, r'projects', lookup='project', trailing_slash=False)
projects_router.register(r'requests', ProjectRequestViewSet, base_name='project-requests')
# ...
requests_router = NestedSimpleRouter(router, r'requests', lookup='request', trailing_slash=False)
requests_router.register(r'statuses', RequestStatusViewSet, base_name='request-statuses')
# ...
urlpatterns = [
url(r'^', include(router.urls)),
url(r'^', include(projects_router.urls)),
url(r'^', include(requests_router.urls)),
url(r'^auth/', include('rest_framework.urls', namespace='rest_framework')),
url(r'^token-auth', views.obtain_auth_token),
]
由于我已更新到 Django 1.9.1,因此我收到以下警告:
.\env\lib\site-packages\django\template\utils.py:37:
RemovedInDjango110警告:您尚未定义模板设置。 您必须在升级到 Django 1.10 之前这样做。否则 Django 会 无法加载模板。 "无法加载模板。", RemovedInDjango110Warning)
.\balrog\urls.py:8: RemovedInDjango110Warning:
django.conf.urls.patterns() 已弃用并将在 姜戈 1.10。将您的 urlpatterns 更新为 django.conf.urls.url() 实例代替。 url(r'^admin/', 包括(admin.site.urls)),
(这不是这个问题的重点,但也感谢任何帮助删除这些警告的帮助。)
每当我尝试使用 API 获取具有日期字段的对象时,都会收到以下错误:
ValueError: make_aware 需要一个简单的日期时间,得到 2016-01-15 17:18:44.258843+00:00
因此,如果 USE_TZ 设置为 False,则不会发生此错误,但这并不理想,我需要将其设置为 True。
消除此错误的另一种方法是编辑.\env\Lib\site-packages\django\utils\timezone.py
并更改此 make_aware 函数:
def make_aware(value, timezone=None, is_dst=None):
"""
Makes a naive datetime.datetime in a given time zone aware.
"""
if timezone is None:
timezone = get_current_timezone()
if hasattr(timezone, 'localize'):
# This method is available for pytz time zones.
return timezone.localize(value, is_dst=is_dst)
else:
# Check that we won't overwrite the timezone of an aware datetime.
if is_aware(value):
raise ValueError(
"make_aware expects a naive datetime, got %s" % value)
# This may be wrong around DST changes!
return value.replace(tzinfo=timezone)
到这里:
def make_aware(value, timezone=None, is_dst=None):
"""
Makes a naive datetime.datetime in a given time zone aware.
"""
if timezone is None:
timezone = get_current_timezone()
if hasattr(timezone, 'localize'):
# This method is available for pytz time zones.
return timezone.localize(value, is_dst=is_dst)
else:
return value
但这也不理想。
为什么我的 make_aware 函数甚至被调用,因为日期应该已经知道而不是天真的 USE_TZ 设置为 True ?
顺便说一句,我正在使用 SQLite 数据库以防万一(因为 sqlite 使用日期字段作为字符串 afaik)
【问题讨论】:
标签: python django datetime django-models timezone