【发布时间】:2017-06-28 10:02:32
【问题描述】:
我有这些模型,我需要做一些计算并将它们呈现给用户。我渲染了大约 2-3k 行,这导致对数据库执行 4k 次查询(从调试工具栏显示)。有没有办法优化这个?我已经尝试过使用 prefetch_related 但它只是在 4k 之上添加了另一个正在完成的查询..
class Cart(models.Model):
name = models.CharField(max_length=15)
user = models.OneToOneField(User)
def sum_for_this(self, taxtype, tax):
return self.carttax_set.filter(tax__type__name=taxtype,
tax__tax=tax).aggregate(
sum=Coalesce(Sum('tax_amount'), Value('0'))
).get('sum')
class TaxType(models.Model):
name = models.CharField(max_length=10)
class Tax(models.Model):
name = models.CharField(max_length=100)
type = models.ForeignKey(TaxType)
tax = models.DecimalField()
class CartTax(models.Model):
cart = models.ForeignKey(Cart)
tax = models.ForeignKey(Tax)
base = models.IntegerField()
tax_amount = models.IntegerField()
我在模板中做的是:
{% for cart in cartlist %}
{{ cart.sum_for_this }}
{% endfor %}
我试过了,但没有效果:
Cart.objects.prefetch_related('carttax_set').all()
def sum_for_this 方法正在执行所有查询..
【问题讨论】:
-
您可以尝试使用
Prefetch过滤您获取的查询集,然后在 Python 中进行求和,而不是使用聚合。
标签: python django postgresql