使用manytomanyfield过滤模型

时间:2018-06-13 17:34:51

标签: python django

我有这些模特:

work.py

class Work(models.Model):
  ...
  network = models.ManyToManyField(Network,related_name='network')

network.py

class Network(models.Model):
    ...
    users = models.ManyToManyField(User, related_name="users")

在我的 views.py 中,我得到了这个基于类的通用ListView

class WorkList(PermsMixin, ListContextMixin, ListView):
model = Work
# Here I want to filter queryset

我想要做的是过滤查询集,以便登录用户在网络用户中。

我尝试了很多东西,例如

 queryset = Work.objects.all()
 queryset.filter('self.request.user__in=network_users')

但我收到了这个错误:

 ValueError : too many values to unpack (expected 2)

有人可以帮我吗?

1 个答案:

答案 0 :(得分:0)

这是编写查询的方式。通常,您会传递到.filter(..) 名为的参数,这些参数遵循" 语言"指定你想要的

在您的情况下,您希望 - 如果我理解正确 - 所有 Work s存在与相关的 Network属于那个User,您可以这样做:

Work.objects.filter(network__users=self.request.user).distinct()

此处 两个连续下划线(__用于查看" "一种关系。如果是一对多关系,或多对多关系,一个路径(从WorkNetwork的路径就足够了user.distinct())存在。

如果您只想返回不同的Work,则应使用 Work :如果您不使用此选项,则可以使用相同的Network对象在查询集中多次次,因为可能存在属于给定user多个 Work,并且是related_name的一部分}。

  

额外备注:您定义的network = models.ManyToManyField(Network,related_name='network')与字段名称完全相同,例如:

related_name
     

但是Network 不是您在那里定义的关系的名称,相关名称是 reverse 关系:的名称您在WorkWork之间定义的隐式关系。所以现在意味着您通过编写some_network.network来获取network = models.ManyToManyField(Network,related_name='work') s的查询集,这是没有意义的。因此,您通常会给它起一个名称:

mvncdf