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?
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
...