在 Django 中查询多个表并返回组合查询集,同时命中数据库一次



假设我设置了以下模型:

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))

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

如果需要合并到来自不同模型的查询集,最好/最快的方法是使用 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 .

最新更新