django查询 - 如何排除数据[子查询的好例子]

时间:2011-05-30 07:55:56

标签: django

我有一张包含以下样本数据的表格:

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的队长和中尉的条目,为user_id 20留下消防员的条目。

我还想过使用Q对象,它允许我创建OR。但同样,这仍然留下了user_id 20的消防员条目。

我无法弄清楚如何识别user_id 20有多个条目,因此将他/她从消防员列表的结果中删除。

感谢。

1 个答案:

答案 0 :(得分:2)

使用排名数字(即1firefighter2lieutenant等等。然后,您将轻松排除任何高于(或低于)所需等级的人。或者,您可以为任何具有聚合的用户选择最大(最小)排名。

如果您不想更改数据库架构,可以使用一个子查询选择它:

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')