запрос django - как исключить данные [хороший пример подзапроса] - PullRequest
1 голос
/ 30 мая 2011

У меня есть таблица со следующими образцами данных:

id   user_id       rank             date_promoted
1      20        firefighter         1991-10-31
2      32        lieutenant          2003-01-03
3      34        firefighter         1990-11-23
4      20        lieutenant          1993-02-03
5      20        captain             2007-05-23
6      46        firefighter         1999-12-03

id - мой первичный ключ. user_id - это внешний ключ для пользователей в таблице auth_user.

Моя цель - создать запрос, который предоставляет список старшинства по рангу Так, например, чтобы создать запрос для ранга 'пожарный', я бы отфильтровал по рангу для пожарного и упорядочил по date_promoted. Но моя проблема в том, что user_id 20 больше не пожарный. Его повысили до лейтенанта, а затем до капитана. Как я в своем запросе исключил его из списка пожарных?

Я думал об использовании 'exclude', но это создает AND и просто отфильтровывает записи для капитана и лейтенанта для user_id, оставляя запись для firefighter для user_id 20.

Я также думал об использовании объектов Q, что позволяет мне создавать ИЛИ. Но опять же, это оставляет запись пожарного для user_id 20.

Я не могу понять, как определить, что user_id 20 имеет несколько записей и, следовательно, удалить его / ее из результатов для списка пожарных.

Спасибо.

1 Ответ

2 голосов
/ 30 мая 2011

Используйте числа для рангов (т.е. 1 для firefighter, 2 для lieutenant и т. Д.). Тогда вы легко исключите любого, кто выше (или ниже), чем желаемый ранг. Или вы сможете выбрать максимальный (минимальный) ранг для любого пользователя с агрегацией.

Если вы не хотите изменять схему БД, вы можете выбрать ее одним подзапросом:

ranks = ['firefighter', 'lieutenant', 'captain']
n = 0 # 0 - for firefighter, 1 - for lieutenant etc.    

higher_users = MyModel.objects.filter(rank__in=ranks[n+1:]).values_list('user_id', flat=True)
results = MyModel.objects.filter(rank=ranks[n]).exclude(user_id__in=higher_users).order_by('date_promoted')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...