如何在 Django 额外操作中添加过滤器

问题描述 投票:0回答:1

我有一个带有额外操作的 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

我怎样才能实现这个目标?

django django-rest-framework django-filter
1个回答
0
投票

我可以通过添加自定义过滤器类并将其作为

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
    ...
© www.soinside.com 2019 - 2024. All rights reserved.