【问题标题】:Most efficient way to query Django model by distinct groups and iterate over those subset queries按不同组查询 Django 模型并遍历这些子集查询的最有效方法
【发布时间】:2020-03-31 02:19:04
【问题描述】:

数据库是 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', ]

【问题讨论】:

  • 你能给我们看看你的模型吗?
  • 检查我的答案@juju。如果您可以为您的问题添加更多详细信息,我可以更新我的答案。
  • @GrandPhuba 我为我的问题添加了更多信息。阅读您当前的解决方案有助于理解我的解决方案可能不是很有效,但是是的,我将对每个日期子查询的每个实例进行复杂的工作

标签: django django-queryset


【解决方案1】:

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

  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。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-09-03
    • 2018-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多