我开始使用Django构建的项目,我无法弄清楚什么。Django:make_aware期待一个天真的日期时间
我在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),
]
既然我已经更新到1.9.1 Django的,我有以下警告:
.\env\lib\site-packages\django\template\utils.py:37:
RemovedInDjango110Warning: You haven't defined a TEMPLATES setting. You must do so before upgrading to Django 1.10. Otherwise Django will be unable to load templates. "unable to load templates.", RemovedInDjango110Warning)
.\balrog\urls.py:8: RemovedInDjango110Warning:
django.conf.urls.patterns() is deprecated and will be removed in Django 1.10. Update your urlpatterns to be a list of django.conf.urls.url() instances instead. url(r'^admin/', include(admin.site.urls)),
(这不是这个问题的要点,但任何帮助去除这些警告也表示赞赏。 )
每当我试图得到一个对象与API的日期字段,我得到以下错误:
ValueError: make_aware expects a naive datetime, got 2016-01-15 17:18:44.258843+00:00
所以不会发生,如果这个错误设置为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的使用日期字段作为字符串据我所知)