给定一堆图形 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/