2011-02-04 3 views
1

У меня есть тезисы модель:комплексов Джанго запрос

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 но не group2:

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

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

Вы имеете в виду, что хотите найти модели 'Group', которые * только * имеют' position' равные ''worker'', и никакие другие значения? –

+0

Точно! Я добавил пример на мой вопрос, чтобы быть более ясным. – Etienne

ответ

2

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

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

Edit:

выше не исправить, так вот моя вторая попытка:

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

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

+0

К сожалению, это не сработает. Это в основном эквивалентно в 'Group.objects.filter (person__position =" worker ")', потому что NOT из 'exclude' отменяет NOT' 'Q'. Оба запроса дают одинаковый результат. – Etienne

+0

Вы правы, я отредактировал свой ответ – XORcist

+0

О, хорошо! Действительно интересный подход. Я попробовал, и он работает! Мне нужно адаптировать его к моим реальным моделям (они определенно более сложны, чем мой пример). Но я уверен, что это сработает. И с моими реальными моделями я могу использовать 'id' внутри' Q'-запросов, поэтому 'lt' и' gt' обязательно будут работать. Благодарю. – Etienne

0

Посмотрите на аннотацию: http://docs.djangoproject.com/en/dev/topics/db/aggregation/

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

+0

Ваша идея кажется хорошей, но, к сожалению, я не могу ее реализовать. Я не могу найти правильный способ написать его. На самом деле, я попытался решить это прямо в SQL, и я тоже не могу этого сделать ... – Etienne

Смежные вопросы