Django:RunTimeWarning:DateTimeField 在时区支持处于活动状态时收到了一个天真的日期时间

Posted

技术标签:

【中文标题】Django:RunTimeWarning:DateTimeField 在时区支持处于活动状态时收到了一个天真的日期时间【英文标题】:Django : RunTimeWarning : DateTimeField received a naive datetime while time zone support is active 【发布时间】:2016-10-03 02:36:44 【问题描述】:

我正在尝试基于django cart 测试购物车创建

但是当我尝试创建购物车时出现此错误:

RunTimeWarning : DateTimeField 在时区支持处于活动状态时收到一个简单的日期时间

我做了一些研究,但我无法解决 datetime.datetime.now() 的问题

test_views.py 在我的测试目录中:

from django.test import TestCase, Client, RequestFactory
import unittest
from django.contrib.auth.models import User, AnonymousUser
from front.models import Entreprise, Cart, CartItems
from decimal import Decimal
from front.cart import models
import datetime
import pytz
from pytz import all_timezones
from django.utils import timezone



def _create_cart_in_database(self, creationDate=datetime.datetime.now(), checkedOutDate=True):
    """
        Helper function so I don't repeat myself
    """
    cart = models.Cart()
    cart.creationDate = creationDate
    cart.checkedOutDate = False
    cart.save()
    return cart


def test_cart_creation(self):
    creationDate = datetime.datetime.now()
    cart = self._create_cart_in_database(creationDate)
    id = cart.id

    cart_from_database = models.Cart.objects.get(pk=id)
    self.assertEquals(cart, cart_from_database)

models.py:

class Cart(models.Model):
    creationDate = models.DateTimeField()

我的设置中还有USE_TZ = True

我试过timezone.now(),但还是不行:

def _create_cart_in_database(self, creationDate=timezone.now(), checkedOutDate=True):

def test_cart_creation(self):
    creationDate = timezone.now()

RunTimeWarning : DateTimeField Cart.creationDate 在时区支持处于活动状态时收到了一个简单的日期时间 (2016-06-03 08:46:34.829000)。

编辑:

我现在有这个错误,似乎是日期时间格式错误?

    updated = self._save_table(raw, cls, force_insert, force_update, using, upda
te_fields)
  File "C:\Python27\lib\site-packages\django-1.9.5-py2.7.egg\django\db\models\ba
se.py", line 820, in _save_table
    result = self._do_insert(cls._base_manager, using, fields, update_pk, raw)
  File "C:\Python27\lib\site-packages\django-1.9.5-py2.7.egg\django\db\models\ba
se.py", line 859, in _do_insert
    using=using, raw=raw)
  File "C:\Python27\lib\site-packages\django-1.9.5-py2.7.egg\django\db\models\ma
nager.py", line 122, in manager_method
    return getattr(self.get_queryset(), name)(*args, **kwargs)
  File "C:\Python27\lib\site-packages\django-1.9.5-py2.7.egg\django\db\models\qu
ery.py", line 1039, in _insert
    return query.get_compiler(using=using).execute_sql(return_id)
  File "C:\Python27\lib\site-packages\django-1.9.5-py2.7.egg\django\db\models\sq
l\compiler.py", line 1059, in execute_sql
    for sql, params in self.as_sql():
  File "C:\Python27\lib\site-packages\django-1.9.5-py2.7.egg\django\db\models\sq
l\compiler.py", line 1019, in as_sql
    for obj in self.query.objs
  File "C:\Python27\lib\site-packages\django-1.9.5-py2.7.egg\django\db\models\sq
l\compiler.py", line 958, in prepare_value
    value = field.get_db_prep_save(value, connection=self.connection)
  File "C:\Python27\lib\site-packages\django-1.9.5-py2.7.egg\django\db\models\fi
elds\__init__.py", line 728, in get_db_prep_save
    prepared=False)
  File "C:\Python27\lib\site-packages\django-1.9.5-py2.7.egg\django\db\models\fi
elds\__init__.py", line 1461, in get_db_prep_value
    value = self.get_prep_value(value)
  File "C:\Python27\lib\site-packages\django-1.9.5-py2.7.egg\django\db\models\fi
elds\__init__.py", line 1440, in get_prep_value
    value = super(DateTimeField, self).get_prep_value(value)
  File "C:\Python27\lib\site-packages\django-1.9.5-py2.7.egg\django\db\models\fi
elds\__init__.py", line 1296, in get_prep_value
    return self.to_python(value)
  File "C:\Python27\lib\site-packages\django-1.9.5-py2.7.egg\django\db\models\fi
elds\__init__.py", line 1399, in to_python
    parsed = parse_datetime(value)
  File "C:\Python27\lib\site-packages\django-1.9.5-py2.7.egg\django\utils\datepa
rse.py", line 93, in parse_datetime
    match = datetime_re.match(value)
TypeError: expected string or buffer

【问题讨论】:

除了 Selcuk 的回答之外,您可能希望避免将方法默认设置为 now() 方法。我很确定它不会在您每次调用该函数时都执行...就在第一次初始化时 @Sayse 那么你知道我怎样才能给出另一个日期而不是 now() 吗? now 是正确的(我怀疑您可能仍在运行旧代码并且可能需要重新启动开发服务器)。 Simpy 将默认设置为None,然后检查方法内部是否为 none,如果是,请将其设置为 now 内部 @Sayse 我重新启动了服务器,但没有任何改变。我很抱歉,但我能问你我在哪里以及如何将默认设置为 None 吗?我还是个新手…… def _create_cart_in_database(self, creationDate=None.. 【参考方案1】:

以下行创建了一个简单的(非时区感知)日期时间:

creationDate = datetime.datetime.now()

尝试将该行更改为:

creationDate = timezone.now()

不要忘记在代码开头导入timezone

from django.utils import timezone

【讨论】:

这里的时区应该是服务器的时区吧?如果有不同时区的用户,我们要记录他们的时区,我们该怎么办? @MukundGandlur 就 ORM 而言,没有“用户”。如果您想考虑网站用户(通过 django-auth)的时区,您必须编写一个视图,将正确的日期时间发送到辅助方法。 我的设置是USE_TZ = True, TIME_ZONE = 'UTC'. 但是当我使用timezone.now() 时,它不会显示tzinfo=<UTC>...。所以这个日期时间对象被作为幼稚的对象传递。为什么会这样? @user3595632 是的,strptime 不返回时区感知日期时间。见this question。

以上是关于Django:RunTimeWarning:DateTimeField 在时区支持处于活动状态时收到了一个天真的日期时间的主要内容,如果未能解决你的问题,请参考以下文章

python3 Django 报错RuntimeWarning的解决办法

Freezegun 总是导致 RuntimeWarning 收到天真的日期时间

django中使用时间帅选报RuntimeWarning: DateTimeField Coupon.valid_begin_date received a naive datetime (2018-

RuntimeWarning:DateTimeField 收到一个天真的日期时间

Django 日期时间查询

如何修复'RuntimeWarning:在 double_scalars 中遇到的除以零'