我有使用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?
有没有办法做我正在尝试的事情?
答案 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
个对象