假设我有一个带有两个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上没有看到这样的限制。
答案 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')
无效?
F()
对象表示 模型字段或带注释的列的值 。
因此,表达式 start_date__year
不是模型字段或带注释的列