Django: фильтр набора запросов для * всех * значений из ManyToManyField - PullRequest
3 голосов
/ 21 сентября 2009

Привет (извините за мой плохой английский: p)

Представьте себе эти модели:

class Fruit(models.Model):
    # ...

class Basket(models.Model):
    fruits = models.ManyToManyField(Fruit)

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

baskets = Basket.objects.filter(fruits__in=Fruit.objects.all())

# This doesn't work:
baskets = Basket.objects.filter(fruits=Fruit.objects.all())

Какое-нибудь решение решает эту проблему?

Большое спасибо. :)

1 Ответ

6 голосов
/ 21 сентября 2009

У меня нет набора данных для проверки, но я думаю, что он должен работать:

Basket.objects.annotate(num_fruits=Count('fruits')).filter(num_fruits=len(Fruit.objects.all()))

Он аннотирует каждый объект корзины с количеством связанных фруктов и отфильтровывает те корзины, у которых количество фруктов равно общему количеству фруктов.

Примечание: вам нужен Django 1.1, чтобы это работало.

...