使用 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
似乎更清楚。)
说,我有以下两个 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
似乎更清楚。)