2015-08-24 2 views
0

Согласно документации, exclude() объединяет несколько параметров с помощью AND, но вместо этого мой запрос использует логику ИЛИ.Django: несколько параметров в exclude объединены OR insted of AND

У меня есть следующие модели:

class Book(models.Model): 
    # some fields 
    authors = models.ManyToManyField(Author) 

И я хочу, чтобы все книги, за исключением тех, где только один автор и идентификатор автора является «12»:

q_and = Book.objects.annotate(authors_number=Count('authors')).exclude(authors_number=1, authors__in=['12']) 

Но вместо этого, Я получаю результат, похожий на запрос с логикой ИЛИ:

q_or = Book.objects.annotate(authors_number=Count('authors')).exclude(authors_number=1).exclude(authors__in=['12']) 

Если я фильтрую книги с единственным автором и uthor № в = '12' , я получаю те мне нужно исключить:

need_to_exclude = Book.objects.annotate(authors_number=Count('authors')).filter(authors_number=1, authors__in=['12']) 

Я знаю, как сделать, что я хочу в двух запросов, но как сделать то же самое с одним запросом, используя exclude()?

И что не так с моим запросом?

ответ

0

Попробуйте это; Это операция ИЛИ.

from django.db.models import Q 

q = Q(Q(authors_number=1)| Q(authors__in=['12'])) 
q_and = Book.objects.annotate(authors_number=Count('authors')).exclude(q).distinct() 
+0

Я пробовал это. Результат совпадает с моими первыми двумя запросами. – opportunity356

+0

Возможно, причина в m2m подана? – opportunity356

+0

Можете ли вы попробовать с отличными() –

Смежные вопросы