Как я могу выполнить AND lookups с объектами Q при использовании повторяющихся аргументов вместо цепочки фильтров?

Я понял, что мой вопрос проще, я оставляю тело предыдущего вопроса в качестве дополнительного объяснения. У меня возникают проблемы с запросами И с объектами Q. Как это работает? Я привел 4 примера, и единственный раз, когда я могу заставить его работать, – это привязать фильтры, однако я хочу избежать этого, чтобы строить более сложные запросы, используя OR.


У меня возникли проблемы с выполнением запроса через отношения с объектами Q, когда AND'ид тем же самым запрошенным аргументом.

Немного изменив пример на странице документации Django: Модель «Блог» имеет отношение m2m с моделью «Автор». Предположим, я хочу запросить все блоги, которые отвечают следующим критериям: Боб и Мэри – авторы, или Стив – автор. Я почти уверен, что единственный способ сделать это – с объектами Q, поэтому я разбиваю их на куски. Это то, что я пытался сделать до сих пор:

Blog.objects.filter(Q(author__name='bob', author__name='mary')) 

возвращает с повторением SyntaxError: ключевое слово

 Blog.objects.filter(Q(author__name='bob') & Q(author__name='mary')) 

возвращает пустой запрос

 Blog.objects.filter(author__name='bob', author__name='mary') 

возвращает с повторением SyntaxError: ключевое слово

 Blog.objects.filter(author__name='bob').filter(author__name='mary') 

возвращает правильный результат, однако теперь я потерял способность использовать объекты Q для аргументов OR (я считаю), поэтому мне пришлось бы выполнить другой запрос и получить результат в 2 запросах, что нежелательно

Я не уверен, что правильно объяснил свою ситуацию, или если я даже подойду к этому правильно. У кого-нибудь есть совет?

Я считаю, что это должно работать:

 Blog.objects.annotate(author2=author).filter(Q(author__name='bob') & Q(author2__name='mary')) 

Таким образом, кажется, что вы просто не можете использовать объекты Q для И того же аргумента, даже если это отношение M2M. Я нашел решение на Reddit, чтобы в основном построить несколько запросов с помощью цепочечных фильтров, а затем их вместе, устраняя необходимость в Q-объектах:

 b1 = Blog.objects.filter(authors__name='bob').filter(authors__name='mary') b2 = Blog.objects.filter(authors__name='steve') qs = b1 | b2