按不同组查询 Django 模型并迭代这些子集查询的最有效方法

Most efficient way to query Django model by distinct groups and iterate over those subset queries

数据库是MySQL 我试图通过按 date_created 字段对它们进行分组并遍历每个查询来遍历模型中的所有字段。我已经能够这样做,但我的方法似乎效率低下。有没有更好,更清洁的方法?该数据库预计将达到 50,000 行以上,唯一日期长达一年或过去一年。我计划在 date_created 子查询的每个查询中进行复杂的工作,并且需要访问模型中的其他字段。我计划主要使用这些数据在使用 Django 和 Heroku 的网页上显示图表和内容。

    data = model.objects.all()

    distinct_dates = data.values('date_created').distinct()

    for each_date in distinct_dates:
        data.filter(date_created=each_date['date_created'])

each_date 的值将是与模型和该字段关联的每个唯一日期

这是我的模型

class Model(models.Model):
    expansion = models.CharField(max_length=255, default='', db_index=True)
    value = models.DecimalField(max_digits=12, decimal_places=2, default=0)
    date_created = models.DateField(db_index=True)

    class Meta:
        ordering = ['date_created', ]

这个问题的答案取决于许多因素,其中一些因素如下:

  1. 您正在使用的数据库
  2. 数据库和您的应用程序之间的网络
  3. 数据行数
  4. 数据集中唯一日期的数量
  5. 之后您打算如何处理这些数据
  6. 申请详情

考虑以下用例:

  1. 如果您所做的只是获取数据而不对其进行任何操作,那么大多数时候一次获取所有数据会更快。
data = model.objects.all()
  1. 如果您打算只获取每个日期的聚合值,那么执行以下操作会更快:
data_by_dates = model.order_by('date_created').values(
    'date_created'
).annotate(
    count=Count('date_created'), total=Sum('amount')
)
  1. 如果您有数千个日期的数据,但每个日期只有几行数据,并且您按日期收集行,那么您也将连接到数据库一百万次。
  2. 如果您只有 7 天的数据,但在那个日期每秒有一个数据点,那么您将获得 86400 个数据点,但只连接到数据库 7 次
  3. 如果您有一年的数据,并且每秒有一个数据点,并且您决定一次收集所有这些数据,那么这将占用大量服务器内存。如果您计划在纯 python 中处理该数据,那么这也会耗尽您的 CPU。

我可以想出更多的用例,但除非你知道你实际想要做什么,并且你知道所涉及的上下文,否则很难说 "most efficient" 方法是什么.