TypeError get_queryset()缺少1个必需的位置参数:“ pk”

时间:2018-10-01 09:48:58

标签: python django django-models django-views

我正在处理会计申请...

我有一个名为group的模型,我想在特定公司内部制作...

我的意思是,不同的公司会有不同的组

所以,我已经在列表视图中尝试过类似的事情

class group1ListView(LoginRequiredMixin,ListView):
    model = group1

    def get_queryset(self, pk):
        company_details = get_object_or_404(company, pk=pk)
        return self.model.objects.all().filter(Q(User=self.request.user) & Q(Company=company_details.id))

在我的group1模型中,用户和公司字段通过外键关联。

但是出现此错误:

  

TypeError get_queryset()缺少1个必需的位置参数:“ pk”

有人可以告诉我我在做什么错吗?

谢谢

1 个答案:

答案 0 :(得分:1)

pk不是get_queryset中的参数,只有self

URL的位置和命名参数分别存储在self.argsself.kwargs中。

因此您可以将get_queryset修改为:

class group1ListView(LoginRequiredMixin,ListView):
    model = group1

    def get_queryset(self):  # no pk parameter
        company_details = get_object_or_404(company, pk=self.kwargs['pk'])
        return self.model.objects.filter(
            User=self.request.user,
            Company=company_details.id
        )

不过,您可以通过编写单个查询来提高效率(但语义略有不同),例如:

class group1ListView(LoginRequiredMixin,ListView):
    model = group1
    allow_empty = False

    def get_queryset(self):  # no pk parameter
        return self.model.objects.filter(
            User=self.request.user,
            Company=self.kwargs['pk']
        )

在找不到此类allow_empty = False的情况下,如果想提高404,可以添加group1

您的urls.py当然需要传递pk值,例如:

# app/urls.py

urlpatterns = [
    url(r'^(?P<pk>\d+)$',views.group1ListView.as_view(),name='grouplist')
]

因此,您随后可以查询具有公司group路径的公司id。如果这是根URL,那么它类似于host.org/123

但是我建议将参数重命名为company_pk,因为现在,您“暗示”这是pk模型的group1,而不是{ {1}}。这种混淆可能导致查询 look 正确,但不正确。如果大多数开发人员看到

之类的查询,都会感到奇怪。
Company

但当他们看到

时不会
group1.objects.get(pk=self.kwargs['company_pk'])