如何解决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\')
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。