0

我有带 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?

有什么办法可以做我正在尝试的事情吗?

4

2 回答 2

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)
于 2013-08-23T19:25:19.003 回答
1

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

与时间相关的字段查找转换为基础字段类型的范围,因此__in=[...]不会自然地转换为基础 SQL IN (...),因此我们被 oringQ对象困住了。

于 2013-08-23T19:28:30.547 回答