django聚合,用范围注释

时间:2014-01-28 10:29:44

标签: python django django-queryset

  class Sold(model.Model)
        product = models.ForeignKey(Product)
        model_name = models.ForeignKey(ProductModels)
        sold_date = models.DateField()
        model_qty = models.IntegerField()

      def __unicode__(self):
             return self.sold_date

我想了解2014年1月1日至1月31日期间已售出多少model_qty

这是我的疑问:

  a = Sold.objects.filter().aggregate(res=Sum('model_qty'))

当我打印时,我得到了a['res'] = 12,这很好,

现在我使用range这样:

a = Sold.objects.filter(sold_date__range = ('2014-01-01' , '2014-01-31')).annotate(res=Sum('model_qty'))
a.aggregate(Sum('model_qty'))

我得到了答案。有没有更好的方法来编写此查询?

1 个答案:

答案 0 :(得分:1)

您编写的查询在SQL中用类似

的方式表示
select sum(model_qty) from sold where sold_date > '2014-01-01' and sold_date < '2014-01-31'

这已经过优化,因为您可能会得到它(除非您可以执行某些特定于数据库的优化),因此您遇到的任何性能问题更可能是由查询数量引起的。

但是,我猜测你实际上没有对它进行分析,或者使用实时数据运行查询来测试性能。在您尝试优化代码之前,我建议您这样做(使用调试工具栏进行报告)。很可能你会发现瓶颈在其他地方。