TypeError get_queryset () отсутствует 1 обязательный позиционный аргумент: 'pk' - PullRequest
0 голосов
/ 01 октября 2018

Я работаю над бухгалтерским приложением ...

У меня есть модель, называемая группой, которую я хочу создать внутри конкретной компании ...

Я имею в виду, что в другой компании будут разныенабор групп

Итак, я попробовал что-то подобное в моем представлении списка

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 голосов
/ 01 октября 2018

pk не является параметром в get_queryset, есть только self.

Позиционные и именованные параметры URL хранятся в self.args и self.kwargs соответственно.

Таким образом, вы можете исправить get_queryset на:

class group1ListView(LoginRequiredMixin,ListView):
    model = group1

    def get_queryset(self):  # no pk parameter
        company_details = get_object_or_404(company, pk=<b>self.kwargs['pk']</b>)
        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<b>=self.kwargs['pk']</b>
        )

Мы можем добавить allow_empty = False в случае, если мы хотим поднять 404, когда таких group1 s не найдено.

Ваш urls.py, конечнонеобходимо передать значение pk, например:

# app/urls.py

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

Таким образом, вы можете запросить group компании с путем, который имеет id компании.Если это корневой URL, то это что-то вроде host.org/123

Я думаю, что желательно переименовать параметр в company_pk, поскольку прямо сейчас вы «намекнете», что это pk модели group1, а не Company.Эта путаница может привести к запросам, которые выглядят правильными, но это не так.Большинству разработчиков будет странно, если они увидят запрос типа

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

, но не увидят

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