使用 django-filter 组合查询集上的多个过滤器

Combining multiple filters on querysets with 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 解决这个问题,还是我应该在视图中实现自己的过滤逻辑?

如果您想将其保留在 FilterSet 中,而不是向上推送到视图,您最好的选择是覆盖 qs 属性 并添加 multi-那里的值过滤逻辑。

(具有自定义 method 的字段提供验证但仍然只采用单个值 — 因此您无论如何都需要从 parent 中提取其他值 — 因此,重写 qs 似乎更清楚。)