查询多个表并在Django中访问数据库一次返回组合查询集

时间:2019-04-07 21:51:28

标签: python django

可以说我有以下模型设置:

class X(models.Model):
     ...

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

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

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

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

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

1 个答案:

答案 0 :(得分: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,也无法以这种方式查询两个不同的模型。