Django 冷冻枪总是在收到原始日期时发出运行时警告

Django 冷冻枪总是在收到原始日期时发出运行时警告,django,timezone,freezegun,Django,Timezone,Freezegun,我正在使用一个可以暂停组织的测试用例。 目前我正在使用freezegun冻结固定时间,这是一个datetime.datetime对象,具有tzinfo=pytz.UTC 在下面的测试中,您将看到一个打印的self.fake_datetime,它返回一个tzawaredatetime:2000-01-01 00:00:00+00:00 当测试运行时,我不断得到著名的RuntimeWarning: /usr/local/lib/python2.7/dist-packages/django/db/mo

我正在使用一个可以暂停组织的测试用例。 目前我正在使用
freezegun
冻结固定时间,这是一个
datetime.datetime
对象,具有
tzinfo=pytz.UTC

在下面的测试中,您将看到一个打印的
self.fake_datetime
,它返回一个
tzaware
datetime:
2000-01-01 00:00:00+00:00

当测试运行时,我不断得到著名的
RuntimeWarning

/usr/local/lib/python2.7/dist-packages/django/db/models/fields/init.py:1447:RuntimeWarning:DateTimeField-Organization.suspended在时区支持处于活动状态时收到一个原始日期时间(2000-01-01 00:00:00)。 运行时警告)

我一直在使用,但没有成功删除运行时警告

对如何妥善解决这一问题有何建议?我想在没有运行时警告的情况下继续使用冷冻枪。压制是一种选择,但我不愿意

更新——基于

服务正在保存日期时区,但不知道。旧情况注释,新情况为实际代码。我考虑了很多关于
模拟的问题,并假设
服务
中保存的日期时间将由
冰枪
模拟测试用例中的时区感知日期时间对象,但事实并非如此

def suspend(organization, reason):
    """
    Suspend an organization with the given reason.
    :param mc_organization.models.Organization organization: The organization to suspend.
    :param string reason: The reason of the suspending.
    :return: None
    """
    # organization.suspended = datetime.datetime.now() (Old sitation)
    organization.suspended = timezone.now()  # timezone aware situation.
    organization.suspended_reason = reason
    organization.save()
看来你是个好人。要消除此警告,只需在应用程序中的任何位置使用时区感知日期时间


您可以使用Django的
时区
模块,而不是使用
pytz
手动管理时区。它有一些快捷方式,可以用来将naive datetime转换为aware datetime

使用此功能的一个优点是,如果您更改设置文件中的时区设置,它将自动选择新时区,而使用
pytz
时,您必须在任何地方手动更新新时区

from django.utils import timezone

fake_datetime = timezone.make_aware(timezone.datetime(2000, 1, 1, 0, 0, 0))

谢谢你的解决方案。我希望datetime对象在测试过程中被模拟为使用了
freezegun
,这是一个错误的假设。我已使用您的答案中的修复更新了我的问题,并描述了我的错误假设。作为一种快捷方式,您可以替换此行-
时区。make_aware(datetime.datetime.now())
-使用它将自动返回时区感知
now
时间。
from django.utils import timezone

fake_datetime = timezone.make_aware(timezone.datetime(2000, 1, 1, 0, 0, 0))