Сложный запрос Джанго - PullRequest
       5

Сложный запрос Джанго

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

У меня есть тезисы моделей:

class Person(models.Model):
    position = models.CharField(max_length=64)
    group = models.ForeignKey('Group')

class Group(models.Model):
    ...

Теперь я хочу запрос, который вернет мне все отличные Group, где все люди в каждой группе имеют позицию работник . Поэтому у меня будут все группы, в которых будут только рабочие. Как это сделать?

Я начал с:

groups = Group.objects.filter(person__position='worker').distinct()

Но с этим у меня есть группы, в которых есть люди, которые не работник .

Например, мой запрос должен вернуть group1, но not group2:

group1
    person1 -> position=worker
    person2 -> position=worker
    person3 -> position=worker

group2
    person4 -> position=worker
    person5 -> position=looser
    person6 -> position=sleeper

Ответы [ 2 ]

2 голосов
/ 04 февраля 2011

Это должно работать:

Group.objects.exclude(~Q(person__position="worker"))

Редактировать:

Вышеприведенное неверно, поэтому вот моя вторая попытка:

Group.objects.filter(
    Q(person__position="worker") 
    & ~Q(person__position__gt="worker")
    & ~Q(person__position__lt="worker")
)

Я не уверен, что это можно использовать со всеми базами данных.Это работает с моей установкой PGSQL.

0 голосов
/ 04 февраля 2011

Загляните в аннотацию: http://docs.djangoproject.com/en/dev/topics/db/aggregation/

Я не могу вспомнить точный синтаксис, но вы должны иметь возможность аннотировать каждую группу числом лиц с положением = «работник», а также общим числом людей, а затем фильтровать его только в тех группах, где эти лица два счета равны.

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