使用Django避免O(n)查询
我有这样的模型:使用Django避免O(n)查询,django,django-models,complexity-theory,Django,Django Models,Complexity Theory,我有这样的模型: 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(P
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(...)
...
My质押item
有一种计算质押百分比的方法(例如,一个项目可能花费100美元,每个项目有3个20美元的质押,意味着60%的质押):
出于这个问题的目的,请假设我正确地处理了self.usd_amount
为零的情况,以及质押项上没有质押的情况(尽管我不得不问,为什么在这些情况下总和(字段)
返回无
)
问题是,如果我在n
质押项的列表中调用percentage\u质押
,我每个质押项都有一个查询。是否有一种优雅的方法可以解决此问题,而无需使用保存
信号来更新百分比
字段?如果我能以某种方式预取这些数据(即一次性获取所有承诺
,然后循环遍历它们),那就太好了
我甚至不确定解决方案会是什么样子(例如,这组承诺将在哪里运行?),但我确定这是一个常见的问题(以前也有一个问题困扰过我),所以我想我应该看看那些对Django更有经验的人是如何解决这个问题的。可能save
信号就是它的归属,特别是对于“低写高读”类型的站点。这是Django 1.1中新聚合功能的工作
您希望为查询集中的每个质押项“注释”质押金额字段。这很容易做到:
from django.db.models import Sum
PledgeItems.objects.all().annotate(pledge_sum=Sum(pledge__usdamount))
显然,您可以用所需的任何筛选器替换all()
您仍然需要对每个抵押项进行百分比计算,但这不会导致任何额外的查询。这是Django 1.1中新聚合功能的工作
您希望为查询集中的每个质押项“注释”质押金额字段。这很容易做到:
from django.db.models import Sum
PledgeItems.objects.all().annotate(pledge_sum=Sum(pledge__usdamount))
显然,您可以用所需的任何筛选器替换all()
您仍然需要对每个质权项进行百分比计算,但这不会导致任何额外的查询