Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Django避免O(n)查询_Django_Django Models_Complexity Theory - Fatal编程技术网

使用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()

您仍然需要对每个质权项进行百分比计算,但这不会导致任何额外的查询