Django ORM通过2个相关路径的外键获取相关集

时间:2013-04-01 21:57:24

标签: django django-models django-orm

我正在研究一个有一些复杂关系的系统,我正试图找到一种有效的方法来过滤一些数据。

假设我有以下关系:

model C - FK - > model B - FK - > model A

model C - FK - > model R - FK - > model T - FK - > model Z

鉴于model A的实例,如何才能将所有Z与之关联?

一种方法(我认为有效 - 但效率不高)如下:

class A(models.Model):
    @property
    def get_related_Zs(self):
        Cs = models.C.objects.filter(B__A=self)
        Zs = models.Z.objects.filter(R__T__Z__in=Cs).distinct()
        return Zs

也许这是最好的方法(我对此表示怀疑)。有什么想法可以更有效地实现这个目标吗?

1 个答案:

答案 0 :(得分:3)

那是:

class A(models.Model):
    @property
    def get_related_Ts(self):
        Ts = T.objects.filter( R__C__B__A = self ).distinct()
        return Ts

解释:简单的方法是从您需要的模型T开始。然后,您可以通过关系导航到A。 django query api会将它转换为数据库后端的SQL连接。

注意:请记住,在执行句子之前,数据库中应该存在模型。