djangodjango-rest-frameworkdjango-filter

How to add filters in Django extra actions


I have a ViewSet with extra action shown below

class Parent(
  mixin.CreateModelMixin, 
  mixin.ListModelMixin, 
  mixin.RetrieveModelMixin, 
  viewset.GenericViewSet
):
  queryset = Model.objects.all()
  serializer_class = ParentSerializer
  ...
  ...
  @action(detail=True, methods=["get", "post"], serializer_class=SomeSerializerclass)
  def extra(self, request, *args, **kwargs):
    if request.method == "GET":
      .... do something
    else:  # request.method is POST
      .... do something
    ...

I want to add few optional query parameters to this extra action endpoint like: parent/1/extra/?name=somename and this will filter the data for this name if request.method is GET. Also, this query param can be multiple like: parent/1/extra/?name=somename&surname=foo

How can I achieve this?


Solution

  • I was able to do by adding a custom filter class and addind that as filterset_class attribute to @action

    class MyCustomFiltersetClass(filters.FilterSet):
        fieldname = filters.CharFilter(
            field_name="fieldname", lookup_expr="exact"
        )
        
        class Meta:
           model = MyModel
           fields = ['filename']
    
    class Parent(
      mixin.CreateModelMixin, 
      mixin.ListModelMixin, 
      mixin.RetrieveModelMixin, 
      viewset.GenericViewSet
    ):
      queryset = Model.objects.all()
      serializer_class = ParentSerializer
      ...
      ...
      @action(detail=True, methods=["get", "post"], serializer_class=SomeSerializerclass, filterset_class=MyCustomFiltersetClass)
      def extra(self, request, *args, **kwargs):
        if request.method == "GET":
          .... do something
        else:  # request.method is POST
          .... do something
        ...