【问题标题】:Evaluate multiple querysets in a single db call在单个数据库调用中评估多个查询集
【发布时间】:2018-05-01 06:39:30
【问题描述】:

假设我有一个未评估的查询集列表:

q_list = [a.objects.all(), b.objects.all(),...]

我想在一次数据库调用中一次评估所有这些。我可以像这样遍历列表并单独评估它们:

evaluated_q_list = map(list, q_list)

但这会产生多个数据库查询。是否可以使用 Django ORM 在单个数据库查询中执行此操作?

【问题讨论】:

  • @Pabasara Ranathunga 这个问题是关于连接列表的,我想通过在单个调用中评估所有查询集来最小化往返时间。
  • q_list 不是已经被评估了吗?尝试打印 q_list 中每个元素的长度
  • 不,它没有。这是一个小测试:from django.db import connection l = [a.objects.all()] print(len(connection.queries)) # Will print 0

标签: python django django-orm


【解决方案1】:

如果您想要在这里将两个查询与 SQL UNION 操作结合起来,Django supports that as a QuerySet method

但不清楚为什么要尝试将其强制到单个查询中;有关您的用例的更多信息将有助于提出建议。

【讨论】:

  • 我无法使用 UNION,因为我使用的是 django 1.8。关于用例,我想尽量减少 IO 操作,因为数据库可能存在于通过网络连接的不同机器中。
  • 许多生产 Django 部署涉及单独机器上的数据库。虽然考虑如何减少查询计数是件好事,但尝试对所有内容强制执行单个查询是过早的优化;首先,让您的应用运行,然后对其进行分析并查看性能下降的地方,并使用缓存或更高效的查询等作为您的第一选择。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-01-22
  • 2012-02-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-12
相关资源
最近更新 更多