Какой самый чистый способ подсчета итераций цикла queryset?
Мне нужно просмотреть набор запросов и поместить объекты в словарь вместе с порядковым номером, i, в котором они появляются в наборе запросов. Однако цикл Python for, похоже, не может обеспечить порядковый номер. Поэтому мне пришлось создать собственную переменную i и увеличивать ее при каждом цикле. Я уже делал нечто подобное, является ли это самым чистым решением?
ledgers = Ledger.objects.all()
i = 0
for ledger in ledgers:
print('Ledger no '+str(i)+' is '+ledger.name)
i += 1
enumerate(…)
[Python-doc] предназначен для этого:
ledgers = Ledger.objects.all()
for i, ledger in enumerate(ledgers):
print(f'Ledger no {i} is {ledger.name}')
Вы можете аннотировать индекс следующим образом:
from django.db.models import Window, F
ledgers = Ledger.objects.annotate(index=Window(expression=DenseRank(), order_by=F('id').desc()))
ledgers_dict = dict(ledgers.values_list('index', 'name'))
ledgers.filter(index__lt=5, name__contains='foo') # ledgers is a queryset
После этого вы получите набор запросов, который можно использовать для дальнейших операций с базой данных.