为什么 Model.objects.filter 返回空查询?

Why is Model.objects.filter returning an empty query?

我正在阅读一篇关于 django 的文章,内容是关于对 here 进行查询。我有以下片段。

>>> Entry.objects.first().pub_date
datetime.date(2021, 8, 18)
>>> Entry.objects.first().mod_date
datetime.date(2021, 8, 18)

但是如果我尝试以下操作,我会得到一个空的查询集。

Entry.objects.filter(pub_date__year=F('mod_date__year'))

为什么它不起作用。这是一个错误吗?

与在过滤器中使用时相比,django 使用注释或 F 表达式处理 __year 和其他 __ 日期提取似乎有所不同。

例如在 Postgres 中,使用 filter(pub_date__year=F('mod_date__year')) 生成的查询是:

WHERE EXTRACT(\'year\' FROM pub_date") = ("mod_date")

这会导致错误。但是如果与 filter(pub_date__year=2021):

这样的整数年份一起使用
WHERE "pub_date" BETWEEN 2021-01-01 AND 2021-12-31'

使用提取物:

要解决此问题,请尝试使用 Extract 生成正确的过滤器:

from django.db.models.functions import Extract


Entry.objects.filter(pub_date__year=Extract('mod_date', 'year'))

这将生成此查询:

WHERE EXTRACT(\'year\' FROM "pub_date") = (EXTRACT(\'year\' FROM "mod_date"))'