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)
),
)