我开始研究使用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)),
)
在catalog / 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警告:您尚未定义TEMPLATES设置。 在升级到Django 1.10之前必须这样做。否则Django会 无法加载模板。 “无法加载模板。”, RemovedInDjango110Warning)
。\ balrog \ urls.py:8:RemovedInDjango110Warning:
django.conf.urls.patterns()已弃用,将被删除 Django 1.10。将您的urlpatterns更新为列表 改为使用django.conf.urls.url()实例。 URL(R '^管理员/', 包括(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)
答案 0 :(得分:0)
好吧,实际上,因为我的数据库中的某个日期是手动插入字符串而SQLite没有区别,擦除数据库并使用Django ORM重建它解决了这个问题。