Как отфильтровать Django ManyToManyField на основе точного набора запросов?

#python #django #django-queryset

Вопрос:

Как мы фильтруем экземпляры модели django на основе точных значений в ManyToManyField . Рассмотрим следующий пример: скажем, у нас есть две модели:

 class Author(models.Model):
    name=models.CharField(max_length=200)

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

Я хочу отфильтровать все книги, в которых есть только заданный автор с заданными идентификаторами. Если я хочу отфильтровать набор запросов, скажем, по идентификаторам авторов 1, 2, 3 . Я пытался сделать это:

 Book.objects.filter(authors__id__in=[1,2,3])
 

Это не работает, так как это дает мне список книг, авторы которых имеют эти идентификаторы вместе с другими авторами. Как отфильтровать книги таким образом, чтобы авторы были только в этих идентификаторах

Ответ №1:

Вы можете передать related_name поле модели в ManyToManyField, а затем использовать его в запросе фильтра.

 Class Book(models.Model):
authors = models.ManyToManyField(Author, related_name='authors')
 

и попробуйте выполнить запрос:

 Book.objects.filter(authors__id__in=[1,2,3])