Параметры запроса URL не обрабатываются в django rest

#python #django #django-views #django-rest-framework

#python #django #django-представления #django-rest-framework

Вопрос:

Вот мой views.py :

 class my4appCompanyData(generics.ListAPIView):
    serializer_class = my4appSerializer

    def get_queryset(self,request):
        """Optionally restricts the returned data to ofa company,
        by filtering against a `id` query parameter in the URL. """
        queryset = companies_csrhub.objects.all()
        #url_id = self.request.query_params.get('id', None)
        url_id = request.GET.get('id', None)
        if id is not None:
            queryset = queryset.filter(id=url_id)
        elif id is ALL:
            queryset = companies_csrhub.objects.all()
        else:
            queryset = "Error data not found"
        return queryset
  

И мой urls.py :

 router.register(r'api/my4app/company/$', views.my4appCompanyData.as_view(),base_name="company")
  

URL, используемый для проверки: mywebsite/api/my4app/company/?id=100227

Планирую добавить несколько фильтров со значениями по умолчанию, но не работает. Пожалуйста, помогите.

Комментарии:

1. Вы возвращаетесь в середине этого метода.

Ответ №1:

 class my4appCompanyData(generics.ListAPIView):
    serializer_class = my4appSerializer

    def get_queryset(self,request):
        """Optionally restricts the returned data to ofa company,
        by filtering against a `id` query parameter in the URL. """
        queryset = companies_csrhub.objects.all()
        url_id = request.query_params.get('id', None)
        if id is not None:
            queryset = queryset.filter(id=url_id)
        elif id is ALL:
            queryset = companies_csrhub.objects.all()
        else:
            queryset = []
        return queryset
  

Удалите возвращаемый идентификатор, поскольку id не является набором запросов, поэтому он выдаст ошибку. Также в части else оператора if вы возвращаете string, но вы также не можете этого сделать, поскольку string не является набором запросов.

Комментарии:

1. Извините, что возвращаемый идентификатор был просто опечаткой при проверке, но при этом результат тот же {detail : not found} . Но когда я жестко кодирую то же значение в filter, оно работает. Мне нужен способ доступа к параметрам стиля пары ключ-значение из URL.

2. Есть ли способ отлаживать построчно в django и посмотреть, какой вакуум установлен для параметров? Или предложите лучший метод. Это будет полезно.

3. Я не уверен, но можете ли вы сделать это после получения url_id? url_id = int(url_id)

4. Для отладки используйте pdb.

Ответ №2:

Согласно официальным документам (http://www.django-rest-framework.org/api-guide/filtering/#filtering-against-query-parameters )

Я думаю, что ваш код не работает, потому что вы используете:

 url_id = request.query_params.get('id', None)
  

Вместо:

 url_id = self.request.query_params.get('id', None)
  

В документации вы можете найти, что функция get_queryset просто получает self параметр, вы должны удалить request параметр.

Комментарии:

1. Пробовал url_id=self.request.get(‘id’, None) не работает.