【问题标题】:TypeError get_queryset() missing 1 required positional argument: 'pk'TypeError get_queryset() 缺少 1 个必需的位置参数:'pk'
【发布时间】:2018-10-01 09:48:57
【问题描述】:

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

我有一个名为 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))

User 和 Company 字段通过我的 group1 模型中的外键关联..

但是得到这个错误:

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

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

谢谢

【问题讨论】:

    标签: python django django-models django-views


    【解决方案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,以防我们在找不到这样的group1s 时引发404。

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

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

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

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

    的查询会觉得很奇怪
    group1.objects.get(pk=self.kwargs['company_pk'])
    

    但不是在他们看到时

    group1.objects.get(pk=self.kwargs['pk'])
    

    【讨论】:

    • @NiladryKar:你是如何在这个视图上定义一个 URL 的?
    • @NiladryKar:你意识到为了有一个pk,URL路径需要有这样的参数吗?否则你将如何“推导出”一个 pk?
    • 'url(r'^$',views.group1ListView.as_view(),name='grouplist'),' 这是我做的url...我要做什么改变为了有一个pk
    • 请注意,如果公司不存在,删除 get_object_or_404() 会稍微改变行为 - 您将得到一个空列表而不是 404。
    • 第二个版本就不用加__id了。
    猜你喜欢
    • 2019-07-15
    • 2019-11-12
    • 2018-12-12
    • 2022-01-22
    • 2018-05-10
    • 1970-01-01
    • 2013-07-06
    • 2019-06-25
    • 2013-10-02
    相关资源
    最近更新 更多