2014-01-10 28 views
2

假设我有一个模型:获取在台式重复结果(只有1查询)

class People(models.Model): 
    name = models.CharField(max_length=200) 
    age = models.PositiveIntegerField() 

这是当前的数据吧:

name age 
Bob 18 
Carly 20 
Steve 20 
John 20 
Ted 19 
Judy 17 

如何获得顶级重复?因此:

name age 
Carly 20 
Steve 20 
John 20 

我不能找出如何做到这一点的 Django的查询。我可以按年龄排序,然后找到具有最高年龄的精确匹配,但需要两个查询。

+1

所以只是为了清楚起见,SQL查询将是:'SELECT * FROM人年龄=(选择最大(年龄)从人)'? – RickyA

+0

是的,看起来是正确的。 – justderb

+0

经过一两年后,每个人都会拥有完全相同的年龄? –

回答

2

使用QuerySet.extra

people = People.objects.extra(where=['age=(select max(age) from app_people)']) 

people = People.objects.extra(where=['age=(select max(age) from {})'.format(
    People._meta.db_table 
)]) 
+0

这看起来只能在SQL中使用(来自文档)。有没有一个通用的方法(可以符合支持的引擎)? – justderb

+0

我无法想象通过ORM的方式来避免两个查询(尽管这也没有什么不妥) – yuvi

+0

@justderb,我确认编辑前的答案代码只能在SQLite3中使用。抱歉。我更新了答案。 (在SQLite3,Postgresql中测试过)。 – falsetru

1
People.objects.filter(age=People.objects.order_by('-age')[0].age) 

但它的两个查询杵成一个

+0

或'latest('age')。age' – yuvi