Django Rest Framework过滤器类方法,带有两个参数

时间:2017-01-27 19:14:05

标签: python django django-rest-framework django-filter

我有一个与许多模型有关的模型,如下:

class Father:
   son = # Foreign key to Son model

class Son:
   @property
   def son_daughters:
      if ... :
         obj = TypeA.objects.get(...)
      elif ... :
         obj = TypeB.objects.get(...)
      else:
         obj = TypeC.objects.get(...)

      return obj

我想从女儿的姓名或类型中获取父亲的数据。我有这个过滤器类,我需要发送两个与女儿相关的查询集参数,以获取子id并将其作为过滤器应用于父。这是我的过滤器类:

class FatherFilter(django_filters.rest_framework.FilterSet):
   def daughter(self, method_name, args, **kwargs):

        print(method_name, args, kwargs)
        ...

   daughter_id = django_filters.NumberFilter(method=daughter)

但是当我调用这个端点时,我只得到一个查询参数而不是全部。

有没有办法在这个方法中获取查询参数而不只是一个?

提前致谢。

1 个答案:

答案 0 :(得分:0)

为了实现这一点,我发现Django Rest Framework有一个从django_filters扩展的类。此类称为BaseFilterBackend,可用于扩展默认后端以过滤任何请求。所以我做的是添加一个从BaseFilterBackend扩展的类,如下所示:

from rest_framework import filters

class FatherFilterBackend(filters.BaseFilterBackend):
   def filter_queryset(self, request, queryset, view):
      daughter_id = request.query_params.get("daughter_id", None)
      daughter_name = request.query_params.get("daughter_name", None)

      if daughter_id and daughter_name:
         kwargs = {
            daughter_name: daughter_id
         }
         queryset = queryset.filter(**kwargs)

      return queryset

此过滤器将在其他过滤器之前应用,因此即使您使用的是FilterSet类,也不会丢失BaseFilterBackend中的过滤器。这个解决方案的问题在于它依赖于rest_framework.filters包,这是一个与django_filters无关的过滤器。

这可能不是实现这一目标的最佳方式,因此如果您有更好的想法,请添加它们以帮助其他人遇到类似问题。