python - 如何在 Django ORM 中同时进行多个连接?

标签 python django join

给定一堆图形 map ,我需要查询用户可以访问哪些 map ,要么是因为他拥有该 map ,要么是因为他被授予了该 map 的“成员资格”。

有一个Map_desc( map 描述)模型,对于Map_desc中的每个对象,可能有许多Mapmembership对象。

因为稍后会将其提供给模板中的 ModelChoiceFields,所以我需要一个 QuerySet,它将返回具有相关 Mapmembership 对象的所有 Map_desc 对象,以及将“所有者”设置为当前用户的所有 Map_desc 对象。

这是一个简单的连接,但在 Django 中实现起来却出人意料地困难。

models.py(简化)

class Map_desc(models.Model):
  owner = models.ForeignKey(User, null=False, on_delete=models.CASCADE)

class Mapmember(models.Model):
  member = models.ForeignKey(User, null=False, on_delete=models.CASCADE)
  ofmap = models.ForeignKey(Map_desc, null=False, on_delete=models.CASCADE)

我首先尝试的没有工作(在半伪代码中):

shared = Map_desc.objects.filter(id=mapmember_set.ofmap)

然后第二个查询来获取 map 所有权:

owned = Map_desc.objects.filter(owner=thisUser)

并将它们绑在一起

accessiblemaps = chain(shared,owned)

问题在于,因为有多个Map_desc对象,所以mapmember_set实际上不可用。如果您使用 .first() 将查询限制为仅一个 Map_desc,它确实有效,这就是我发现的所有教程和 SO 问题的作用。

所以我想出了以下解决方案,它确实有效,但我想知道是否有更有效的方法,或者只是不同的方法来帮助我理解 ORM 的含义用于涉及多个“父对象”行的联接。

View .py

from django.db.models import Q

def all_accessible_maps(request, thisUser):
  # Returns maps thisUser has access to, whether owned or as a 'member'
  try:
    sharedmaps = Mapmember.objects.filter(member=thisUser).values_list('ofmap')
    allaccessible = Map_desc.objects.filter(Q(id__in=sharedmaps) | Q(owner=thisUser))    
  except:
    raise

all_accessible_maps.alters_data = True

最佳答案

您只需添加Q(mapmember__member=thisUser)__将与Mapmember表进行连接:

Map_desc.objects.filter(Q(owner=thisUser) | Q(mapmember__member=thisUser))

关于python - 如何在 Django ORM 中同时进行多个连接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48659202/

相关文章:

python - Flask中如何打印出客户端请求到URL的所有数据?

python - 当我想将整个网络分成两个模型时,为什么 Keras ,"Graph disconnected"中会发生此错误?

r - 有多个匹配项时加入数据框并选择随机行

mysql - 使用 mysql_fdw 或将表从 Postgres 连接到 MySQL

java - Hibernate:为多个连接表上的属性创建映射

python - 有没有办法从 Jupyter Notebook 中导航 Web 服务器(两者都在同一服务器上运行)?

python - 如何在 Keras/Theano 中进行反卷积?

python - Django 中的断言错误

django - 'QueryDict' 对象在 Django 中没有属性 'caption'

python - 清理前修改传入django表单的数据