我一直在尝试提出这个查询的 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';
我一直在尝试这样的事情:
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'
最佳答案
django 为您创建了一个隐式关联:group_grouppermissions_set
。您可以在docs中阅读相关内容。关于多对一关系。
因此您的查询将如下所示:
answers = Answer.objects.\
filter(group__grouppermissions_set__user_id=77777)
另请注意,django 将创建LEFT OUTER JOIN
。
然后,当您确信您的查询正在运行时,您可以通过类似的查找向其添加诸如 prefetch_lated
之类的优化。这取决于您想要从 Answer
模型获取的深度。
关于python - 具有多个连接的 Django ORM 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39255696/