从Datefield获得django qs中的数月

时间:2013-08-23 19:13:46

标签: django datetime django-queryset

我有使用DateField的django模型。 如果我需要从某个月获得物品,我可以这样做:

objects = Model.objects.filter(date__month=8)它工作正常,但如果我这样做:

objects = Model.objects.filter(date__month__in=[1, 2, 3])我收到错误:

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

有没有办法做我正在尝试的事情?

2 个答案:

答案 0 :(得分:1)

ORM __month过滤器仅进行精确匹配,但您可以将多个Q对象组合在一起:

objects = Model.objects.filter(Q(date__month=1) | Q(date__month=2) | Q(date__month=3))

Q个对象使用标准的Python |运算符,使用该类的自定义__or__方法实现,因此您可以使用operator.or_reduce来从任意迭代中自动化构造:

list_of_months = [1, 5, 11]
constraints = reduce(operator.or_, (Q(date__month=datenum) for datenum in list_of_months))
objects = Model.objects.filter(constraints)

答案 1 :(得分:1)

您可以在Q中使用filter()个对象,可以使用|将多个过滤条件用于

与时间相关的字段查找会转换为基础字段类型的范围,因此__in=[...]不会自然地转换为基础SQL IN (...),因此我们会遇到oring Q个对象