2016-11-14 2 views
0

Say, я две следующие модели Django:Объединение нескольких фильтров на querysets с Джанго фильтром

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

Что бы запрос querystring выглядит здесь? Как бы вы дифференцировали два набора объектов '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 - это «общие проблемы с фильтрацией». Необычным может потребоваться выполнение этого вручную. :-) –