【发布时间】:2015-10-26 04:22:11
【问题描述】:
我有一个看起来像这样的模型:
class MyModel(models.Model):
name = models.CharField(max_length=255)
date = models.DateField()
units = models.PositiveIntegerField(default=0)
cost = models.DecimalField(max_digits=12, decimal_places=4, default=0)
...
我需要按日期(即按周、按月等)对所有对象进行分组。对于每个组,我需要对总单位和成本求和,并执行一些其他杂项操作。
我可以通过大量访问数据库来完成大部分工作。例如,如果periods 是一个元组列表,其开始和结束值为datetime.dates,我可以这样做:
for period in periods:
mymodels = MyModel.objects.filter(date__gte=period[0], date__lte=period[1])
sums = mymodels.aggregate(Sum('units'), Sum('cost'))
# do other stuff
或者我可以一次获取所有模型,然后在 python 中完成其余的工作,例如:
models = MyModel.objects.all()
for period in periods:
period_models = [x for x in models if x.date >= period[0] and x.date <= period]
period_units = sum(x.units for x in period_models)
period_cost = sum(x.cost for x in period_models)
# do other stuff
其中哪一个是更好的方法,还是有第三种选择?当我处理 50k 个物体时,我担心速度。
使用第一种方法,我在每个时期都会访问数据库两次(一次是获取相关模型,一次是对值求和),这似乎很繁重。使用后一种方法,我只访问数据库一次,但我将一堆东西加载到内存中(但另一方面,内存很便宜)。
【问题讨论】:
标签: python django performance django-queryset