Исключить отношения «многие ко многим» через третью таблицу - PullRequest
3 голосов
/ 12 ноября 2009

У меня проблема с выполнением «исключающих» запросов для таблиц, которые имеют отношение «многие ко многим» через третью таблицу. У меня есть таблица с проектами, таблица с людьми и таблица отношений с флагами "is_green, is_yellow, is_red", например:

class Project(models.Model):
    ...

class Person(models.Model):
    projects = models.ManyToManyField(Project, through='Status')

class Status(models.Model):
    person = models.ForeignKey(Person)
    project = models.ForeignKey(Project)
    is_green = models.BooleanField()
    ...

Теперь я хочу сделать запрос, возвращающий всех людей, за исключением тех, которые имеют флаг "is_red" в конкретном проекте. Но следующее

Person.objects.exclude(project=p, status__is_red=True)

исключает всех, кто зарегистрирован в проекте p , но имеет статус = красный для любого проекта, в котором он зарегистрирован. Есть ли способ связать второе условие с первым?

Мой подход состоял в том, чтобы напрямую фильтровать таблицу состояния, что, разумеется, работает. Но тогда у меня есть список объектов «Статус» вместо объектов «Персона».

Ответы [ 2 ]

4 голосов
/ 12 ноября 2009

Может быть, это? (Непроверенные)

Person.objects.exclude(id__in=Person.objects.filter(project=p, status__is_red=True).values(id))
0 голосов
/ 12 ноября 2009

Если у вас есть список объектов Status, называемых «объекты», вы можете использовать

[s.person for s in objects]

для включения в список соответствующих лиц.

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