2009-11-23 29 views
2

我需要在Django中构建一个查询,并且我想知道这是否有可能(可能很明显,但我错过了它... )。基于Django中的数据库中的某个字段获取不同的行基于Django中的数据库获取不同的行

我有一个正常的查询Model.objects.filter(x=True)[:5]可以返回这样的结果:

 
FirstName LastName Country 
Bob   Jones  UK 
Bill   Thompson  UK 
David   Smith  USA 

我只需要抢行基础上,Country的字段,它是不同的,像Model.objects.filter(x=True).distinct('Country')[:5]将是理想的,但是这是不可能的Django的。

我希望查询最终抢到的行是:

 
FirstName LastName Country 
Bob   Jones  UK 
David   Smith  USA 

我还需要查询中使用的模型的元级(即设置相同的排序,我不能覆盖排序任何方式)。

我怎么会去这样做呢?

非常感谢。

+0

我只需要数据库的前五行。 – Dx143 2009-11-23 17:36:47

+0

这是一个艰难的,但我不确定我完全理解这个问题。你想要国家独特的前五排吗? – jathanism 2009-11-23 17:53:56

+0

嗨,是的,我确实:)。 – Dx143 2009-11-23 18:27:57

回答

0
countries = [f.country in Model.objects.all()] 

for c in countries: 
    try: 
     print Model.objects.filter(country=c) 
    except Model.DoesNotExist: 
     pass 
0

我认为@skrobul是在正确的轨道上,但有点关闭。

我不认为你可以用单个查询来做到这一点,因为distinct()方法将SELECT DISTINCT修饰符添加到查询中,该查询作用于整行。您可能必须创建一个国家/地区列表,然后根据迭代该列表返回有限的QuerySets。

事情是这样的:

maxrows = 5 
countries = set([x.country for x in Model.objects.all()]) 
rows = [] 
count = 0 
for c in countries: 
    if count >= maxrows: 
     break 

    try: 
     rows.append(Model.objects.filter(country=c)[0]) 
    except Model.DoesNotExist: 
     pass 

    count += 1 

这是一个很普通的例子,但它给了预期的结果。

4

我没有测试过这一点,但它似乎对我的字典应该做的工作,虽然订货会被关闭,那么:

d = {} 
for x in Model.objects.all(): 
    d[x.country] = x 

records_with_distinct_countries = d.values() 
+0

同样的事情可以通过捕获'set'中的值来执行。 – jathanism 2009-11-23 19:12:38

+1

不是。这些国家可以放在一起,因为它们是不变的。但是模型绝对不是一成不变的,所以不能成为一个集合。这就是为什么我使用字典,不可改变的国家作为关键,并将价值记录。我碰巧使用了字典密钥作为一个集合(它在概念上),而不会丢失记录。 – extraneon 2009-11-23 21:14:09

0

你能后的原始SQL返回你从想要什么源数据库?我有一个预感,这里的实际问题是查询/数据结构...

相关问题