将查询集上的多个过滤器与django-filter组合在一起

时间:2016-11-14 14:43:10

标签: django django-filter

说,我有以下两个Django模型:

class Author(models.Model):
    name = models.CharField(max_length=100)

class Book(models.Model):
    name = models.CharField(max_length=300)
    pages = models.IntegerField()
    author = models.ForeignKey(Author)

使用django-filter,如何编写FilterSet,这样我就可以过滤一下:

Author.objects.filter(
    (Q(book__name__contains='How') & Q(book__pages=100)) |
    (Q(book__name__contains='Why') & Q(book__pages=50))
)

也就是说,我希望有一组过滤器字段,它们都应用于相关模型并且我可以组合。就我而言,该集合包含更多字段,因此自定义MultiValueField可能并不适用。

是否有任何标准方法可以使用django-filter解决此问题,还是应该在视图中实现自己的过滤逻辑?

1 个答案:

答案 0 :(得分:1)

如果您希望将其保留在FilterSet中,而不是推回到视图,最好的办法是覆盖qs属性并在那里添加多值过滤逻辑。

(包含自定义method的字段提供了验证功能,但仍然只需要一个值 - 因此您需要从parent中提取其他值 - 因此,覆盖{{1}似乎更清楚。)