关于 django:如何在同一个查询中使用 __year 和 __in?

how to use __year and __in in the same query?

这就是我想要做的。
我有一个里面有年份的列表,例如 years = [2002, 2003, 2004]
我有一个 SomethingModel 和一个 DateField

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

我知道这个作品:

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

所以我试过这个:

1
SomethingModel.objects.filter(date__year__in=years)

但是这会给我这个错误:

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

有人知道怎么做吗?以直接的方式..

谢谢!


你不能,如果你看一下查询集文档

1
Entry.objects.filter(pub_date__year=2005)

成为 SQL 等价物:

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

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

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

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


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


如果你的年份列表总是连续的,你可以这样做

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


你可以试试,

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