如何枚举Django中返回的行?

时间:2019-01-09 19:42:04

标签: django postgresql

类似于Python的enumerate()的工作方式,我想为每行分配返回唯一的递增整数。 (不是行ID,而是结果中的行号!)

for p in models.People.objects.all().values('N', 'name'):
   print p['N'], p['name']

输出为...

0 Mary
1 John
2 Nikita
3 Fred

在这种情况下,我想在SQL后端上执行此操作,而不是简单地将enumerate()包裹在查询结果周围。

我也不希望枚举在数据已更改的查询中保持稳定。

1 个答案:

答案 0 :(得分:0)

这可以在Django 1.x中用annotate完成:

from django.db.models.expressions import RawSQL                                 

qry = models.People.objects.all().\
    annotate(N=RawSQL('row_number() over ()', [])).\
    values('N', 'name')
for p in qry:
    print p['N'], p['name']

在Django 2.0中,可以使用Window通过RowNumber表达式来完成此操作。