Как добавить функцию get_queryset в apiview из Djnago rest framework?
Я использую Django APIView для включения всех моих операций CRUD в одну конечную точку api. Но позже мне понадобилось использовать логику фильтрации на основе переданных параметров запроса. Поэтому я счел нужным включить в get api APIView и сделал отдельный api, используя общее представление, ListAPiview.
Здесь:
class LeadsView(APIView):
permission_classes = [IsAuthenticated]
def get(self, request, pk=None, *args, **kwargs):
id = pk
if id is not None:
abc = Lead.objects.get(id=id)
serializer = LeadSerializer(abc)
return serializer.data
def post(self,request,*args,**kwargs):
abc = LeadSerializer(data=request.data,many=True)
if abc.is_valid():
abc.save()
return Response(abc.data, status=status.HTTP_201_CREATED)
return Response(abc._errors, status=status.HTTP_400_BAD_REQUEST)
def delete(self, request,pk, *args, **kwargs):
Сейчас, когда мне нужно использовать класс filter, а также некоторую пользовательскую логику фильтрации, мне нужно использовать get_queryset. Следовательно, мне придется создать еще один api только для метода get, чего я не хочу.
class LeadAPIView(ListAPIView):
authentication_classes = (TokenAuthentication,)
permission_classes = (IsAuthenticated,)
queryset = Lead.objects.all().order_by('-date_created')
serializer_class = LeadSerializer
filter_backends = [django_filters.rest_framework.DjangoFilterBackend]
pagination_class = CustomPagination
# filterset_fields = [ 'email','first_name','last_name','phone']
filterset_class = LeadsFilter
def get_queryset(self):
source = self.request.GET.get("source", None) #
lead_status = self.request.GET.get("lead_status", None)
if source is not None:
source_values = source.split(",")
if lead_status is not None:
lead_status_values= lead_status.split(",")
return Lead.objects.filter(source__in=source_values,lead_status__in=lead_status_values)
else:
return Lead.objects.filter(source__in=source_values)
elif lead_status is not None:
lead_status_values = lead_status.split(",")
if source is not None:
source_values = source.split(",")
return Lead.objects.filter(lead_status__in=lead_status_values,source__in=source_values)
else:
return Lead.objects.filter(lead_status__in=lead_status_values)
return Lead.objects.all()
My question is, can I use get_queryset in the APIView instead of making another api?? Also, if I can use it, I assume I cant import filterset_class = LeadsFilter
and also pagination? What will be the best approach??
Мои урлы:
path('leads', LeadAPIView.as_view(), name='leads'),
path('lead', LeadsView.as_view(), name='leads-create'),
path('lead/<int:pk>', LeadsView.as_view()),
APIView обозначает MVT-фреймворк. Существует 2 типа случаев.
- Если вы хотите вернуть ответ в ваши шаблоны django, вы используете views.
- В случаях возврата json, xml (в сокращенном ответе) объектов, вы используете терминологию viewset. Viewsets поддерживает filter-class, pagination-class, serialization, queryset, (пользовательские миксины и многое другое). .
p.s. В viewset, если вы хотите перезаписать кверисет по умолчанию, вы определяете метод get_queryset. Views не поддерживает этого. Также, пожалуйста, проверьте наличие декораторов @action в django.