#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) не работает.