检索另一个 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
我有一个 ManyToManyField
到 Objects
,还有一个 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.
中
我有一个简单的问题,但多次 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
我有一个 ManyToManyField
到 Objects
,还有一个 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.
中