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

Nil*_*Kar 3 python django django-models django-views

我正在开发一个会计应用程序...

我有一个名为“组”的模型,我想在特定公司内制作它......

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

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

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))
Run Code Online (Sandbox Code Playgroud)

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

但出现此错误:

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

谁能告诉我我在这方面做错了什么?

谢谢

Wil*_*sem 5

Thepk不是 中的参数get_queryset,只有selfis 。

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
        )
Run Code Online (Sandbox Code Playgroud)

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

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']
        )
Run Code Online (Sandbox Code Playgroud)

如果我们想在找不到allow_empty = False这样的 s 时引发 404,我们可以添加。group1

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

# app/urls.py

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

因此,您可以group使用包含该公司的路径来查询该公司的 s id。如果这是根 URL,则类似于host.org/123

然而,我认为建议将参数重命名为company_pk,因为现在,您“暗示”这是pk模型的group1,而不是Company。这种混淆可能会导致查询看起来正确,但实际上并不正确。如果大多数开发人员看到类似这样的查询,他们会觉得很奇怪

group1.objects.get(pk=self.kwargs['company_pk'])
Run Code Online (Sandbox Code Playgroud)

但当他们看到的时候却不是

group1.objects.get(pk=self.kwargs['pk'])
Run Code Online (Sandbox Code Playgroud)