【问题标题】:How to perform inner join in django如何在 django 中执行内部连接
【发布时间】:2017-08-26 16:10:48
【问题描述】:

取句子: select * from auth_permission left join auth_group_permissions on (auth_group_permissions.permission_id = auth_permission.id) 我如何在 django 中使用 queryset 我不明白内部连接在查询集中是如何工作的

在默认 django auth 模型中

我已经这样做了:

permiso = Permission.objects.all().select_related()
...: for x in permiso:
...:     print(x.group_set.all().query)

并在每个循环中查看:

SELECT "auth_group"."id", "auth_group"."name" FROM "auth_group" INNER JOIN "auth_group_permissions" ON ("auth_group"."id" = "auth_group_permissions"."group_id") WHERE "auth_group_permissions"."permission_id" = 1255

【问题讨论】:

  • 你不加入 Django,Django 为你加入。因此,请添加您的模型并说明您要归档的内容。
  • 我正在尝试权限和组模型来获取这些权限的所有权限以获取具有每个权限的组我有或多或少 4 个组和超过 200 个权限

标签: python django postgresql inner-join


【解决方案1】:

您可以通过prefetch_related检索所有组元素和权限

permissions = Permission.objects.prefetch_related('group_set').all()
for perm in permissions:
   group = perm.group_set.all()

【讨论】:

  • @NEFEGAGO:通常建议不要问类似的duplicate question,并在不影响现有答案的情况下改进原件。然而,这个解决方案更 Pythonic,比我的更简单,甚至通过最少的 SQL 也非常有效。
【解决方案2】:

在 Django 中进行开发时,您通常不会考虑要执行的 SQL 查询。在您的情况下,如果您查看 auth 应用程序的 model definitions,您会发现 Group 模型有一个 permissions 类型为 ManyToMany 的字段。即使该字段是在Group 模型中定义的,您也可以按相反的顺序执行(检查this)。因此,为了列出所有权限并为每个权限指明它们所在的组,您可以执行以下操作:

for perm in Permission.objects.all():
    groups = perm.group_set.all()
    # Do something with groups

【讨论】:

  • 但问题是当我想在模板中渲染时查询变得太慢
猜你喜欢
  • 2018-06-16
  • 1970-01-01
  • 1970-01-01
  • 2016-01-22
  • 1970-01-01
  • 2010-10-26
  • 2018-04-08
  • 2015-02-15
相关资源
最近更新 更多