检索另一个 manytomanyfield 的不同值

retrieve distinct values of manytomanyfield of another manytomanyfield

我有一个简单的问题,但多次 google 搜索让我找不到很好的解决方案。目前我正在做以下事情:

allowed_categories = self.allowed_view.all().difference(self.not_allowed_view.all())
users = []
for cat in allowed_categories:
    for member in cat.members.all():
        users.append(member)
return users

我有一个 ManyToManyFieldObjects,还有一个 ManyToManyField 用于 User 的实例。在上面的代码中,我试图从所有这些类别中获取所有用户并获取所有 User 的列表。 稍后我想在方法 allowed_to_view(self, user_instance) 中使用相同的方法,但那是以后的事。

如何在不使用嵌套 for 循环的情况下使用 Django ORM 实现此目的?

[编辑] 我的模型如下:

class RestrictedView(models.Model):
    allowed_view = models.ManyToManyField(Category)
    not_allowed_view = models.ManyToManyField(Category)

class Category(models.Model):
    name = models.CharField(max_length=30)
    members = models.ManyToManyField(User)

没有看到你的数据库结构/models.py 文件很难说,但你可以像这样搜索成员对象:

members_queryset = Member.objects.filter(
    category = <allowed categories>,
    ...
)

users += list(members.all())

因此,我只对数据库进行了一次查询,就完成了以下一行。我花了一些时间...

users = User.objects.filter(pk__in=self.allowed_view.all().values("users").difference(self.not_allowed_view.all().values("users")))

这给了我一个很好的查询集,其中只有 allowed_view 中的用户并且明确不在 not_allowed_view.