我的模型看起来像这样:
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物体的东西时,我很担心速度。
使用第一种方法我每次都会在数据库中两次(一次获得相关模型,一次总结值),这似乎很重要。使用后一种方法我只会访问数据库一次,但是我将一堆东西加载到内存中(但另一方面,内存很便宜)。
答案 0 :(得分:0)
我想说让数据库处理这个处理。它可能不会在较小的集合上产生明显的差异,但数据库将更有效地处理任何大尺寸的事物。他们通常会更好地利用多个内核,并且针对此类数字运算进行了大量优化。
我快速搜索并提出了这篇文章。
http://patshaughnessy.net/2015/6/18/dont-let-your-data-out-of-the-database
基本上让你的数据库处理尽可能多的处理,只取你的结果并做你可能需要的任何结束。即使你击中它两次,它也会更好地扩展。