我有一个带有额外操作的 ViewSet,如下所示
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
...
我想向这个额外的操作端点添加一些可选的查询参数,例如:
parent/1/extra/?name=somename
,如果 request.method 为 GET
,这将过滤该名称的数据。此外,此查询参数可以是多个,例如:parent/1/extra/?name=somename&surname=foo
我怎样才能实现这个目标?
我可以通过添加自定义过滤器类并将其作为
filterset_class
属性添加到 @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
...