【发布时间】:2022-12-21 03:38:23
【问题描述】:
我有以下型号。
class Document(models.Model):
allowed_groups = models.ManyToManyField(Group, related_name='allowed_documents')
class Person(models.Model):
permission_groups = models.ManyToManyField(Group, related_name='people')
class Group(models.Model):
id = models.BigIntegerField()
我想找到 Person 可以访问的所有文档,条件是他们必须是所有允许组的成员。
我要这个: 案件
- 文档(allowed_groups=1,2,7)与人员(permission_groups=1,2,6,7,11,15)-> 匹配
- 文档(allowed_groups=1,2,7)与人员(permission_groups=1,7)-> NO_MATCH
- 文档 (allowed_groups=1,2,7) 与人员 (permission_groups=1,2) -> NO_MATCH
- 文档 (allowed_groups=1,2,7) with Person(permission_groups=2) -> NO_MATCH
- 文档 (allowed_groups=1,2,7) with Person(permission_groups=8) -> NO_MATCH
- 文档(allowed_groups=1,2,7)与人员(permission_groups=1,2,7)-> 匹配
如果我这样做:
person = Person.objects.get(pk=1) Document.objects.filter(allowed_groups__in=person.permission_groups.all())我会匹配上述所有情况,但 8 除外(不是我想要的)
有很多关于堆栈溢出的问题都在询问精确匹配,即只匹配案例 6 而不是案例 1。(也不是我想要的)
所以我的问题是如何使用 django 来做到这一点?我考虑过使用 SQL,但肯定有一种方法可以使用 Django ORM。这似乎不是一个疯狂的要求。
注意:我有一些其他条件(其他类型的组和文档访问级别),我已经用链式过滤器/Q 对象变成了一个复杂的表达式,但除了这一点之外,我已经解决了所有问题。
另外:我在表述问题标题时遇到了一些麻烦,这可能就是我找不到答案的原因。它不需要是查询集,它可以只是 pks 列表或其他一些方法。
【问题讨论】:
标签: django many-to-many django-queryset django-orm django-filter