按日期字段Django按月过滤数据

时间:2012-11-22 13:46:35

标签: python mysql django

我需要编写一个返回月份列表中所有对象的查询。月份将根据日期字段计算,即(2012-10-21或2011-04-14)。当我这样做一个月它的工作正常 **Table.objects.filter(ad_date__month=month)**。假设月份= 05

但是,当我试图在几个月的列表中这样做时,它无法正常工作。 **Table.objects.filter(ad_date__month__in=month_list)**。假设month_list = [11,03,01,10]

我收到此错误:

"Join on field 'date' not permitted. Did you misspell 'month' for the lookup type?"

似乎Django认为它是一个连接操作。

请建议,我在最近2天遇到了这个问题。

2 个答案:

答案 0 :(得分:3)

使用Q objects可以提出要求。

以下理解将在month_list中为每个月创建一个Q对象。

(Q(ad_date__month=month) for month in month_list)

所有这一切现在都是

Table.objects.filter(*(Q(ad_date__month=month) for month in month_list))

编辑:

您可以使用reduce函数将“或”所有这些Q对象组合在一起

import operator
q_objects = (Q(ad_date__month=month) for month in month_list)
Table.objects.filter(reduce(operator.or_, q_objects))

答案 1 :(得分:0)

嗨,我知道这不是很好,但它会奏效。

from itertools import chain

result_list = []
for mm in month_list:
    this_query = Table.objects.filter(ad_date__month=mm)
    result_list = chain(result_list, this_query)