我有一张包含以下样本数据的表格:
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有多个条目,因此将他/她从消防员列表的结果中删除。
感谢。
答案 0 :(得分:2)
使用排名数字(即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')