2016-11-14 98 views
0

说,我有以下两种Django模型:上查询集结合使用多种过滤器和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,或者我应该在视图中实现我自己的过滤逻辑?

+0

会是什么请求查询字符串看起来像这里?你如何区分你想过滤的两组'Q'对象? – Sherpa

+0

'?book_name_1 = How&book_pages_2 = 100&book_name_2 = why&book_pages_2 = 50' – janoliver

回答

1

如果你想保留这个在FilterSet,而不是回到视图,你最好的选择是覆盖qs属性,并在那里添加多值过滤逻辑。

(使用自定义method提供了验证,但仍然只需要一个值的字段 - 所以你需要拉从parent别人无论如何 - 这样,覆盖qs显得更加清晰。)

+0

我认为是这样,并决定在视图中以标准django形式手动执行操作会更容易且更易读。然而,你的答案仍然是'django-filter'的正确方法,所以我会接受它。 – janoliver

+0

是的,够公平的。 Django Filter的范围是“常见的过滤问题” - 不常见的可能需要手动完成。 :-) –