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

时间:2020-03-31 02:19:04

标签: django django-queryset

数据库是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 个答案:

答案 0 :(得分:2)

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

  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。

我可以想出更多的用例,但是除非您知道实际要做什么,并且知道所涉及的上下文,否则很难说出“最有效”的方式是什么。

相关问题