具有多个联接的Django ORM查询

2024-04-26 07:29:48 发布

您现在位置:Python中文网/ 问答频道 /正文

我一直在尝试提出这个查询的django版本,但我似乎无法理解。在

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';

我一直在尝试这样的事情:

^{pr2}$

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

我肯定我错过了一些关系。在

型号:

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'

Tags: keyidtruemodelmodelsgroupdoclass
1条回答
网友
1楼 · 发布于 2024-04-26 07:29:48

django为您创建了一个隐式关联:group_grouppermissions_set。你可以在docs中读到关于多对一关系的内容。在

因此,您的查询将如下所示:

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

还要注意,django将创建LEFT OUTER JOIN。在

{3}你可以很自信的添加查询。这取决于您想从Answer模型中获取的深度。在

相关问题 更多 >