【问题标题】: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

      【讨论】:

        猜你喜欢
        • 2019-12-19
        • 2011-01-09
        • 1970-01-01
        • 2011-12-21
        • 2019-03-27
        • 2010-09-23
        • 1970-01-01
        • 2010-10-12
        相关资源
        最近更新 更多