我有这些模特:
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)
有人可以帮我吗?
答案 0 :(得分:0)
这是不编写查询的方式。通常,您会传递到.filter(..)
名为的参数,这些参数遵循" 语言"指定你想要的。
在您的情况下,您希望 - 如果我理解正确 - 所有 Work
s存在与相关的 Network
属于那个User
,您可以这样做:
Work.objects.filter(network__users=self.request.user).distinct()
此处 两个连续下划线(__
)用于查看" 到"一种关系。如果是一对多关系,或多对多关系,一个路径(从Work
到Network
的路径就足够了user
到.distinct()
)存在。
如果您只想返回不同的Work
,则应使用 Work
:如果您不使用此选项,则可以使用相同的Network
对象在查询集中多次次,因为可能存在属于给定user
的多个 Work
,并且是related_name
的一部分}。
额外备注:您定义的
network = models.ManyToManyField(Network,related_name='network')
与字段名称完全相同,例如:related_name
但是
Network
不是您在那里定义的关系的名称,相关名称是 reverse 关系:的名称您在Work
和Work
之间定义的隐式关系。所以现在意味着您通过编写some_network.network
来获取network = models.ManyToManyField(Network,related_name='work')
s的查询集,这是没有意义的。因此,您通常会给它起一个名称:mvncdf