代码之家  ›  专栏  ›  技术社区  ›  Dominic Rodger

使用Django避免O(n)查询

  •  0
  • Dominic Rodger  · 技术社区  · 16 年前

    我有这样的模型:

    class PledgeItem(models.Model):
        title = models.CharField(...)
        usd_amount = models.DecimalField(...)
    
    class Pledger(models.Model):
        name = models.CharField(...)
        ...
    
    class Pledge(models.Model):
        pledger = models.ForeignKey(Pledger)
        item    = models.ForeignKey(PledgeItem)
        usd_amount = models.DecimalField(...)
        ...
    

    PledgeItem 有一种方法可以计算出认捐的百分比(例如,一个项目可能花费100美元,有3个认捐,每个20美元,这意味着认捐了60%):

     class PledgeItem(models.Model):
         ...
         def percentage_pledged(self):
             pledge_total = Pledge.objects.filter(item = self).sum(usd_amount)
             return (pledge_total / self.usd_amount) * 100
    

    self.usd_amount Pledges (虽然我不得不问,为什么 sum(field) None

    percentage_pledged 在列表中 n PledgeItems .有没有一种不使用的优雅方法来解决这个问题 save 更新信号a 场?如果我能以某种方式预取这些数据(即获取所有数据),那就太好了 承诺

    承诺 活?),但我确信这是一个常见的问题(以前也困扰过我),所以我想看看那些对Django更有经验的人是如何解决这个问题的。也许吧 信号是它的归属,特别是对于“低写、高读”类型的站点。

    1 回复  |  直到 16 年前
        1
  •  3
  •   Daniel Roseman    16 年前

    这是Django 1.1中新聚合功能的工作。

    您希望将pledge_sum字段“注释”到查询集中的每个PledgeItem。这很容易做到:

    from django.db.models import Sum
    PledgeItems.objects.all().annotate(pledge_sum=Sum(pledge__usdamount))
    

    all() 使用您想要的任何过滤器。

    推荐文章