【问题标题】:Django: Filtering and Manipulating Objects in Python vs SQLDjango:在 Python 与 SQL 中过滤和操作对象
【发布时间】: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


    【解决方案1】:

    我会说让数据库处理处理。它在较小的集合上可能不会产生明显的差异,但是数据库将更有效地处理任何重要的大小。它们通常会更好地利用多核,并针对这种类型的数字运算进行了大量优化。

    我进行了快速搜索并想出了这篇文章。

    http://patshaughnessy.net/2015/6/18/dont-let-your-data-out-of-the-database

    基本上让您的数据库处理尽可能多的处理,并且只获取您的结果并完成您可能需要的任何处理。即使你击中它两次,它也会更好地扩展。

    【讨论】:

      猜你喜欢
      • 2010-12-30
      • 2014-05-31
      • 2012-09-29
      • 1970-01-01
      • 1970-01-01
      • 2017-01-07
      • 2021-03-21
      • 2013-08-16
      • 1970-01-01
      相关资源
      最近更新 更多