如何在同一个查询中使用__year和__in?

时间:2011-06-22 12:55:35

标签: django django-queryset

所以这就是我要做的事 我有一个里面有多年的清单,例如years = [2002, 2003, 2004]
我有SomethingModelDateField

我想做一个查询,它将返回属于那一年的所有对象:

我知道这项工作:

 SomethingModel.objects.filter(date__year=2003) 
 SomethingModel.objects.filter(date__in=[list with dates])

所以我试过这个:

SomethingModel.objects.filter(date__year__in=years)

但是这回复了我这个错误:

FieldError: Join on field 'date' not permitted. Did you misspell 'year' for the lookup type?

有谁知道如何做到这一点?直接的方式..

谢谢!

4 个答案:

答案 0 :(得分:6)

如果你看the queryset documentation

,你不能
Entry.objects.filter(pub_date__year=2005)

成为SQL等价物:

SELECT ... WHERE pub_date BETWEEN '2005-01-01' AND '2005-12-31 23:59:59.999999';

所以你不能在概念上混合__in和__date。你无论如何都不能混合后缀,因为第一个“后缀”将被解释为不存在的关系。

您需要使用小于过滤器和大于过滤器,或者如果列表不连续,则需要使用额外的where字段,例如:

SomethingModel.objects.extra(where=["YEAR(date) IN (" + ",".join([str(x) for x in [2003, 2008, 2010]]) + ")"])

答案 1 :(得分:0)

你可以尝试,

SomethingModel.objects.filter(date__year=[year for year in years])

答案 2 :(得分:0)

如果您的年份列表总是连续的,您可以

SomethingModel.objects.filter(date__year__gte=years[0], date__year__lte=years[-1])

答案 3 :(得分:0)

您可以使用: SomethingModel.objects.filter(date__range =(date_1,date_2)