Python 带有两个参数的Django Rest框架过滤器类方法

Python 带有两个参数的Django Rest框架过滤器类方法,python,django,django-rest-framework,django-filter,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

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

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
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
我想从女儿的姓名或类型中获取父亲数据。我有一个过滤器类,我需要发送两个与女儿相关的查询集参数,以便获得女儿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)
但是当我调用这个端点时,我只得到一个查询参数,而不是全部

有没有一种方法可以在这个方法中获取查询参数,而不仅仅是一个


提前感谢。

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

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
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_过滤器无关的过滤器


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

这似乎与DRF无关。django筛选器是一个完全独立的包。django Rest将django筛选器实现为一个包。若要使用django筛选器类,请验证它:对于历史/上下文,django筛选器是一个完全独立的包。然而,DRF过去提供了一个“过滤器后端”,允许您轻松地将django过滤器与DRF集成。此后,此筛选器后端已移动到
django\u filters.rest\u framework
子包中。您在这里遇到的问题与DRF没有直接关系。您在这里试图做什么还不完全清楚。您能否提供一个示例URL或查询字符串以及filterset应该生成的queryset?至于您的问题,您可以直接访问
self.data
,尽管我不建议您这样做,因为这样会绕过验证。谢谢,@Sherpa。很抱歉,我不够清楚,我发布了这段代码作为期望结果的示例,但真正的代码依赖于许多模型和视图,这些模型和视图对于理解最终结果可能更复杂。我找到了实现这一目标的方法,虽然这可能不是最好的方法,但它现在起作用了。我会把答案贴在下面。谢谢。DRF文档没有提到导入的来源!