Django:make_aware期待一个天真的日期时间

时间:2016-01-22 13:15:05

标签: python django datetime django-models timezone

我开始研究使用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)

1 个答案:

答案 0 :(得分:0)

好吧,实际上,因为我的数据库中的某个日期是手动插入字符串而SQLite没有区别,擦除数据库并使用Django ORM重建它解决了这个问题。