【问题标题】:What's the cleanest way of counting the iteration of a queryset loop?计算查询集循环迭代的最干净的方法是什么?
【发布时间】:2022-01-13 11:00:14
【问题描述】:
我需要遍历一个查询集并将对象连同序列号 i 一起放入字典中,它们出现在查询集中。然而,Python for 循环似乎没有提供序列号。因此,我必须创建自己的变量 i 并在每个循环中递增它。我做过类似的事情,这是最干净的解决方案吗?
ledgers = Ledger.objects.all()
i = 0
for ledger in ledgers:
print('Ledger no '+str(i)+' is '+ledger.name)
i += 1
【问题讨论】:
标签:
python
django
for-loop
【解决方案1】:
enumerate(…) [Python-doc] 就是为此而设计的:
ledgers = Ledger.objects.all()
for i, ledger in enumerate(ledgers):
print(f'Ledger no {i} is {ledger.name}')
【解决方案2】:
这不完全是您问题的答案。
如果您之后在 QuerySet 中需要索引,您可以这样注释它:
from django.db.models import Window, F
ledgers_qs = Ledger.objects.annotate(index=Window(expression=DenseRank(), order_by=F('id').desc()))
# You can iterate over the object indexes and names
for index, name in ledgers_qs.values_list('index', 'name'):
print('Ledger no '+str(i)+' is '+ledger.name)
i += 1
# You can make further QuerySet operations if needed
# because ledgers is a QuerySet with annotated indexes:
ledgers_qs.filter(index__lt=5, name__contains='foo')
这样,您将获得一个查询集,可用于进一步的数据库操作。
我为什么要创建这个答案?
因为如果可能的话,最好使用 QuerySet 来增强现有的代码结构而不受限制。
DenseRank