【问题标题】:Querying multiple tables and returning a combined queryset in Django while hitting the database once查询多个表并在 Django 中返回组合查询集,同时访问数据库一次
【发布时间】:2019-04-07 21:51:27
【问题描述】:

假设我有以下模型设置:

class X(models.Model):
     ...

class Y(models.Model):
     x = models.ForeignKey(X)

class Z(models.Model):
     x = models.ForeignKey(X)

现在,在一个方法中,我想获取与给定X 对象相关的所有Y 对象和Z 对象。我想访问我的数据库一次,然后返回一个组合查询集。现在,我正在这样做:

x = X.objects.get(pk=1)
queryset = []
for cls in [Y, Z]:
    queryset += list(cls.objects.filter(x=x))

注意:通过循环运行它很重要,因为在我的实际代码中有很多模型,所以循环使整个事情保持干燥。我怎样才能做到这一点?谢谢。

【问题讨论】:

标签: python django


【解决方案1】:

如果您需要合并到来自不同模型的查询集,最好/最快的方法是使用itertools。请记住,这会将其从 QuerySet 转换为普通的 List

from itertools import chain
x = X.objects.get(pk=1)
y = Y.objects.filter(x=x)
z = Z.objects.filter(x=x)
result_list = list(chain(y, z))

据我所知,没有办法以这种方式查询两个不同的模型,即使使用 select_relatedprefetch_related

【讨论】:

  • 转换为列表没问题。这只会访问数据库一次,对吗?
猜你喜欢
  • 2015-08-19
  • 2019-08-17
  • 2013-09-06
  • 1970-01-01
  • 2019-03-14
  • 2016-05-09
  • 1970-01-01
  • 2018-12-01
  • 2018-09-29
相关资源
最近更新 更多