2016-08-31 56 views
0

我一直在想出这个查询的Django版本,我似乎无法得到它。Django与多个连接的ORM查询

SELECT 
    * 
FROM answer a 
LEFT JOIN groups g 
    ON a.group_id = g.id 
LEFT JOIN group_permissions gp 
    ON g.id = gp.group_id 
WHERE gp.user_id = '77777'; 

我一直是这样的:

answers = Answer.objects.filter(user_id=user_id).prefetch_related('group__grouppermissions') 

答案关联到组。组与多个用户相关联。组权限与组和用户相关联。

我确定我错过了某处的某种关系。

型号:

class User(models.Model): 
    id = models.BigAutoField(primary_key=True) 
    username = models.CharField(max_length=255) 

class Answer(models.Model): 
    id = models.BigAutoField(primary_key=True) 
    user = models.ForeignKey('User', models.DO_NOTHING) 
    group = models.ForeignKey('Groups', models.DO_NOTHING) 
    class Meta: 
     managed = False 
     db_table = 'answer' 

class Groups(models.Model): 
    id = models.BigAutoField(primary_key=True) 
    name = models.CharField(unique=True, max_length=255) 

    class Meta: 
     managed = False 
     db_table = 'groups' 

class GroupPermissions(models.Model): 
    id = models.BigAutoField(primary_key=True) 
    group = models.ForeignKey('Groups', models.DO_NOTHING) 
    user = models.ForeignKey('User', models.DO_NOTHING) 
    role = models.IntegerField() 

    class Meta: 
     managed = False 
     db_table = 'group_permissions' 
+0

答案根本与群组无关。你的模型如何定义? – karthikr

+0

答案与组相关联。 Answer有一个映射到group:id(pk)的组ID(外键)。 – dimxasnewfrozen

回答

0

有一个内隐联想的Django为你创建:group_grouppermissions_set。您可以在docs中了解关于多对一关系的信息。

所以您的查询就会像这样的事情:

answers = Answer.objects.\ 
    filter(group__grouppermissions_set__user_id=77777) 

还要注意,Django会创建LEFT OUTER JOIN

然后,当您确信您的查询正在运行时,您可以使用类似的查找方式向prefetch_related添加优化。这取决于你想从Answer模型获取多深。