django:为什么我不能在F()表达式中使用__year查找?

时间:2019-05-16 04:52:45

标签: python django

假设我有一个带有两个DateField的模型:

class Event(models.Model):
    start_date = models.DateField()
    finish_date = models.DateField()

这使我可以进行比较这些字段的查询,例如

ee=Event.objects.filter(finish_date=F('start_date'))

我可以处理日期的年份,例如

ee=Event.objects.filter(finish_date__year=2000)

但是当我尝试在__year内使用相同的查询F()时,就像这样:

ee=Event.objects.filter(finish_date__year=F('start_date__year'))

,它失败:

FieldError: Cannot resolve keyword 'year' into field. Join on 'start_date' not permitted.

是否有这种行为的原因,或者看起来像是错误?

我正在使用Django 1.11,在https://docs.djangoproject.com/en/1.11/topics/db/queries/#using-f-expressions-in-filters上没有看到这样的限制。

1 个答案:

答案 0 :(得分:2)

您尝试过吗?

from django.db.models.functions import ExtractYear
from django.db.models import F

Event.objects.annotate(finish_date_year=ExtractYear(F('finish_date'))).filter(start_date__year=F('finish_date_year'))

为什么F('start_date__year')无效?

来自Django Doc,

  

F() 对象表示 模型字段或带注释的列的值

因此,表达式 start_date__year 不是模型字段带注释的列