Django - запрос объектов через отношение многие ко многим - PullRequest
0 голосов
/ 20 июля 2011

Мои модели выглядят так:

class Category(models.Model):
    name = models.CharField(_('name'), max_length=50)

class Product(models.Model):
    name = models.CharField(_('product name'), max_length=40)
    category = models.ManyToManyField(Category)

Я пытаюсь создать фильтр-запрос, в котором я могу выбрать 1 или несколько категорий и вернуть товары, связанные со всеми выбранными категориями.

Пример

Продукт_1 - принадлежит к категории_1, категории_2

Продукт_2 - Принадлежит к категории_1, категории_2 и категории_3

При фильтрации по категориям_1 и категории_2 оба продукта должны возвращатьсязапрос.При фильтрации по всем 3 категориям следует возвращать только Product_2, поскольку это единственный продукт, относящийся ко всем выбранным категориям.

Фильтрация будет динамической, поэтому число категорий для фильтрации может быть бесконечным.

Как мне это сделать?Я попытался сделать

Product.objects.filter(category__in=[1,2,3])

Но это дает мне и product_1, и product_2, так как они соответствуют ЛЮБОЙ из категорий.

Я попытался создать фильтр Q

Product.objects.filter(Q(category__id=1), Q(category__id=2))

Но это не возвращает никакого продукта.

Как будет работать такой запрос?

1 Ответ

4 голосов
/ 20 июля 2011

Я не знаю простого решения для этого, но, возможно, вы можете использовать этот обходной путь:

Product.objects.filter(category__in=[1,2,3]).annotate(total=Count('category')).filter(total=3)

В качестве альтернативы вы можете использовать цепочку фильтров:

Product.objects.filter(category=1).filter(category=2).filter(category=3)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...