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文档没有提到导入的来源!