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表中用户的外键。 我的目标是创建一个查询,该查询提供按等级列出的资历列表。因此,例如,要创建对等级“ firefighter \”的查询,我将按等级过滤消防员,并按date_promoted排序。但是我的问题是user_id 20不再是消防员。他被提升为中尉,然后成为上尉。在我的查询中,我如何将他从消防员名单中排除? 我曾想过使用\'exclude \',但是会创建AND \'s,只是过滤掉user_id的队长和中尉的条目,而将user_id 20的消防员条目过滤掉。 我还考虑过使用Q对象,这使我可以创建OR \。但是同样,这仍然为user_id 20留下了一个消防员条目。 我无法弄清楚如何识别user_id 20具有多个条目,因此将其从消防员列表的结果中删除。 谢谢。     

解决方法

        将数字用于等级(即,
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\')