Django фильтр моделей со списком связанных элементов

Для простой модели Book с связанной таблицей Tag, я хотел бы отфильтровать книги, которые имеют список тегов:

class Book(models.Model):
    name = models.Textfield()

class Tag(models.Model):
    value = models.Textfield()
    book = models.ForeignKey(Book, on_delete=models.CASCADE, related_name="tags")

Если я хочу найти все книги, в которых есть и "красный" тег, и "синий" тег, я не могу просто выполнить:

Book.objects.filter(Q(tags__value="red") & Q(tags__value="blue"))

потому что это пытается найти невозможный тег, который имеет значение "синий" и "красный". Обратите внимание, что ИЛИ-пересечение условий также не является корректным, поскольку я ищу книги, которые имеют как "красный", так и "синий" тег; книга с одним или другим тегом не должна быть возвращена.

Попробуйте это, это предназначено для получения идентификаторов книг, которые имеют любой тег, проверки, какие идентификаторы находятся в обоих списках, и, наконец, запроса нужных вам книг.

Book.objects.filter(
    pk__in=(
        Book.objects.filter(tags__value="red").values_list('pk', flat=True) 
        & Book.objects.filter(tags__value="blue").values_list('pk', flat=True)
    ),
)
Вернуться на верх