Запрос точного содержимого ManyToManyField в Django - PullRequest
1 голос
/ 04 февраля 2012

Как запросить объект, проверив, соответствуют ли члены его отношения manyToManyField точно указанному списку объектов?

Например, задано

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

class Pizza(models.Model):
    # ...
    toppings = models.ManyToManyField(Topping)

Я хочу получить все пиццы с пепперони и луком:

pep = Topping(name='pepperoni')
pep.save()
onion = Topping(name='onion')
onion.save()
tops = [pep, onion]
p = Pizza.objects.filter(toppings__eq=tops)

Django предоставляет оператор __in, но не __eq.Как мне сделать эквивалент?

Спасибо.

Ответы [ 2 ]

1 голос
/ 04 февраля 2012

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

from django.db.models import Q
import operator
pizza = (Pizza.objects
    .filter(reduce(operator.or_, [Q(toppings=topping) for topping in tops]))
    .annotate(count=Count('toppings'))
    .filter(count=len(tops))
    )
0 голосов
/ 04 февраля 2012

Просто соедините ваши фильтры, чтобы получить то, что вы хотите:

pep = Topping(name='pepperoni')
pep.save()
onion = Topping(name='onion')
onion.save()
tops = [pep, onion]
p = Pizza.objects.filter(toppings__id=pep.id).filter(toppings__id=onion.id)

Я не нашел лучшего способа сделать это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...