Как добавить функцию 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 типа случаев.

  1. Если вы хотите вернуть ответ в ваши шаблоны django, вы используете views.
  2. В случаях возврата json, xml (в сокращенном ответе) объектов, вы используете терминологию viewset. Viewsets поддерживает filter-class, pagination-class, serialization, queryset, (пользовательские миксины и многое другое).
  3. .

p.s. В viewset, если вы хотите перезаписать кверисет по умолчанию, вы определяете метод get_queryset. Views не поддерживает этого. Также, пожалуйста, проверьте наличие декораторов @action в django.

Вернуться на верх