【问题标题】:Django : make_aware expects a naive datetimeDjango:make_aware 需要一个天真的日期时间
【发布时间】: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


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2013-09-08
      • 2014-01-29
      • 1970-01-01
      • 1970-01-01
      • 2014-03-28
      • 2019-08-06
      • 2018-02-15
      • 1970-01-01
      相关资源
      最近更新 更多