python - 具有多个连接的 Django ORM 查询

标签 python mysql django join orm

我一直在尝试提出这个查询的 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/

相关文章:

python - 从多个 Python 文件更改相同的文件范围变量

python - numpy 数组切片和 Python 列表切片有什么区别?

php - 分页和$_post含义的解决方案

Mysql - 如果不为空则选择不同

Django Admin基于另一个字段过滤ForeignKey下拉列表

javascript - Django 问题 : manage. py runserver 错误信息

python - 最长公共(public)子序列的界

python - 在 `CheckConstraint` 中创建一个 `UniqueConstraint`

mysql - 将 SQL 列类型设置为 varchar(50),只接受整数

python - 无法将关键字 'items' 解析为字段。选项是 : id, 名称