Какой самый чистый способ подсчета итераций цикла 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

После этого вы получите набор запросов, который можно использовать для дальнейших операций с базой данных.

DenseRank

Вернуться на верх