我有一个与许多模型有关的模型,如下:
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)
但是当我调用这个端点时,我只得到一个查询参数而不是全部。
有没有办法在这个方法中获取查询参数而不只是一个?
提前致谢。
答案 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无关的过滤器。
这可能不是实现这一目标的最佳方式,因此如果您有更好的想法,请添加它们以帮助其他人遇到类似问题。