Django: расширение наборов запросов / подключение нескольких фильтров с помощью OR - PullRequest
3 голосов
/ 29 октября 2009

Мне нужно работать с набором запросов, который уже отфильтрован, например. qs = queryset.filter (language = 'de'), но в некоторых дальнейших операциях мне нужно отменить часть уже примененной фильтрации, например, чтобы не брать только строки с language = 'de', но записи на всех языках. Есть ли способ применить фильтр снова и подключить новые параметры к уже существующим, используя ИЛИ, а не добавить, например? если набор запросов уже отфильтрован для language = 'de', и я смогу подключить к нему 'OR language =' en ', это даст мне то, что я ищу! Спасибо!

1 Ответ

2 голосов
/ 29 октября 2009

Я не верю, что возможно сделать то, что вы просите.

То, как вы делаете OR в Django, выглядит следующим образом:

Model.objects.filter(Q(question__startswith='Who') | Q(question__startswith='What'))

так что, если вы действительно хотите сделать это:

Model.objects.filter(Q(language='de') | Q(language='en'))

вам нужно будет поместить их обоих в один и тот же вызов filter (), чтобы вы не смогли добавить другое или предложение в последующем вызове filter ().

Я думаю, что причина, по которой вы, возможно, пытаетесь это сделать, заключается в том, что вас беспокоит повторное попадание в базу данных, но единственный способ получить точные результаты - это снова попасть в базу данных.

Если вы просто заинтересованы в создании чистого, СУХОГО кода, вы можете поместить все фильтры, которые являются общими для обоих запросов, вверху, а затем «разветвлять» этот набор запросов позже, например:

shared_qs = Model.objects.filter(active=True)
german_entries = shared_qs.filter(language='de')
german_and_english = shared_qs.filter(Q(language='de') | Q(language='en'))
...