يفقد إطار عرض Django Rest Framework ترقيم الصفحات ، SearchFilter و OrderingFilter عند تجاوز طريقة list ()

2

لا بد لي من تجاوز الافتراضي list() طريقة مجموعة DRF ViewSet ولكن ، عندما أقوم بذلك ، تتوقف جميع عمليات التصفية والطلب وترقيم الصفحات عن العمل.

هذا هو رمز ViewSet:

class ZoneViewSet(viewsets.ModelViewSet):
    permission_classes = (permissions.IsAuthenticated,)
    queryset = models.Zone.objects.all()
    serializer_class = serializers.ZoneSerializer
    filter_backends = (SearchFilter, OrderingFilter,)
    search_fields = ('city', 'name')

    def list(self, serializer, pk=None):
        if pk:
            queryset = models.Zone.objects.filter(city=pk)
        else:
            queryset = models.Zone.objects.all()
        serializer = serializers.ZoneSerializer(queryset, many=True, context={'request':self.request})
        return Response(serializer.data)

كيف يمكنني تجاوز list() طريقة دون فقدان هذه الوظيفة؟

2 الاجابة

1
افضل جواب

إفتراضي list() تطبق الطريقة كل هذه الميزات. لذا بدلاً من التجاوز list حاول تجاوز get_queryset() طريقة. يمكنك استخدام self.kwargs['pk'] للحصول على pk القيمة:

class ZoneViewSet(viewsets.ModelViewSet):
    permission_classes = (permissions.IsAuthenticated,)
    queryset = models.Zone.objects.all()
    serializer_class = serializers.ZoneSerializer
    filter_backends = (SearchFilter, OrderingFilter,)
    search_fields = ('city', 'name')

    def get_queryset(self):
        pk = self.kwargs['pk']
        if pk:
            queryset = models.Zone.objects.filter(city=pk)
        else:
            queryset = models.Zone.objects.all()
:مؤلف
0

لا تعمل الإجابة المقبولة بالنسبة لي لأن استعلام تعيين المنطق الخاص بالقائمة يكسر التفاصيل ويحذف نقاط النهاية. بدلاً من ذلك ، قمت بلصق تطبيق القائمة وتعديل المنطق لاحتياجاتي

class MyViewSet(viewsets.ModelViewSet):                                                                                
    permission_classes = (IsAuthenticated,)                                                                               
    serializer_class = MySerializer                                                                                    
    filter_fields = ["a_id", "b_id"]                                                                               

    def get_queryset(self):                                                                                               
        return My.objects.all()                                                                                        

    def list(self, request):                      
        # my custom query set logic                                                                                   
        a = self.request.query_params.get("a_id", None)                                                              
        b = self.request.query_params.get("b_id", None)                                                          
        if a is None and b is None:                                                                                
            queryset = My.objects.none()                                                                               
        else:                                                                                                             
            queryset = My.objects.all()
        # end custom                                                                                

        page = self.paginate_queryset(queryset)                                                                           
        if page is not None:                                                                                              
            serializer = self.get_serializer(page, many=True)                                                             
            return self.get_paginated_response(serializer.data)                                                           

        serializer = self.get_serializer(queryset, many=True)                                                             
        return Response(serializer.data)   

انظر http://www.cdrf.co/3.9/rest_framework.viewsets/ModelViewSet.html

:مؤلف

أسئلة ذات صلة

فوق
قائمة طعام