如何在django datetimefield中使用默认的timezone.now查询特定日期?

时间:2020-01-01 11:05:57

标签: django django-timezone

我有一个模型Game,其datetimefield设置为默认的timezone.now()。

class Game(models.Model):
    time = models.DateTimeField(default=timezone.now, blank=True, null=True)

我想查询在特定的一天玩了多少游戏。我尝试了以下命令,效果很好。

games = Game.objects.filter(time=timezone.now().strftime("%Y-%m-%d"))

但是现在我想查询将过滤器设置为特定日期的游戏,比如说timezone.now-1天。我尝试了timezone.localtimetimezone.localdate的不同变体,它们会产生ValueError。

>>> timezone.localtime(datetime.datetime.now(), timezone.get_default_timezone())
Traceback (most recent call last):
  File "<console>", line 1, in <module>
  File "/home/savi/python-environments/comments/lib/python3.6/site-packages/django/utils/timezone.py", line 207, in localtime
    raise ValueError("localtime() cannot be applied to a naive datetime")
ValueError: localtime() cannot be applied to a naive datetime

我研究了不同的问题以及其他sites,但都没有提出任何针对我要尝试的方法的建议。也许我没有看对地方。如果有人可以指导我完成这一工作,我将非常感谢,在此先感谢您,新年快乐。

编辑 我已经按照建议尝试了该解决方案。

>>> time = timezone.now() - datetime.timedelta(days=1)
>>> time.strftime("%Y-%m-%d")
'2019-12-31'
>>> games = Game.objects.filter(time=time.strftime("%Y-%m-%d")
/home/savi/python-environments/comments/lib/python3.6/site-packages/django/db/models/fields/__init__.py:1427: RuntimeWarning: DateTimeField Game.time received a naive datetime (2019-12-31 00:00:00) while time zone support is active.

RuntimeWarning)

还有

>>> games = Game.objects.filter(time=timezone.now().date())
/home/savi/python-environments/comments/lib/python3.6/site-packages/django/db/models/fields/__init__.py:1369: RuntimeWarning: DateTimeField Game.time received a naive datetime (2020-01-01 00:00:00) while time zone support is active.
  RuntimeWarning)

编辑结束

我的settings.py文件

# TIME_ZONE = 'UTC'
TIME_ZONE = 'Asia/Kolkata'

USE_I18N = True

USE_L10N = True

USE_TZ = True

1 个答案:

答案 0 :(得分:0)

但是现在我要查询将过滤器设置为特定日期的游戏,让 说timezone.now-1天

您可以使用datetime.timedelta

games = Game.objects.filter(time = timezone.now() - datetime.timedelta(days=1)))

编辑: 对于特定日期过滤器,您可以在过滤时使用__date

>>> time = timezone.now() - datetime.timedelta(days=1)
>>> time.strftime("%Y-%m-%d")
'2019-12-31'
>>> games = Game.objects.filter(time__date = time.strftime("%Y-%m-%d"))