Django过滤器如何动态创建filterset_fields

问题描述

我编写了一个视点集,该视点集取决于端点:

ALLOWED_ENTITIES = {
    'persons': [Person,PersonSerializer,'__all__'],'locations': [Location,LocationSerializer,('country','city','street')],'institutes': [Institute,InstituteSerializer,('number','name_short','mail_domain')],}

class EntityViewSet(viewsets.ModelViewSet):
    filter_backends = [DjangoFilterBackend]
    filterset_fields = '__all__' #should be ALLOWED_ENTITIES[self.kwargs['entity_name']][2]

    def get_queryset(self):
        model = ALLOWED_ENTITIES[self.kwargs['entity_name']][0]
        return model.objects.all()

    def get_serializer_class(self):
        serializer = ALLOWED_ENTITIES[self.kwargs['entity_name']][1]
        return serializer

urls.py:

urlpatterns = [
    path('',RedirectView.as_view(url=reverse_lazy('aim:api-root'))),url(r'^api/(?P<entity_name>\w+)',EntityListView.as_view({'get': 'list'})),url(r'^/admin/',admin.site.urls),]

它按预期工作,当我转到/ api / persons时,它显示了使用Person Model和PersonSerializer的视图集。

但是问题是,我不知道如何定义filterset_fields = ALLOWED_ENTITIES[self.kwargs['entity_name']][2]并且不能使用filterset_fields = '__all__',因为出现以下错误Unsupported lookup 'icontains' for field 'aim.Department.parent'.其中'aim.Department.parent'是ForeignKey。也许有人知道如何动态定义filterset_fields

谢谢。

解决方法

我找到了答案,可以在filterset_fields中覆盖get_queryset

class EntityViewSet(viewsets.ModelViewSet):
    filter_backends = [DjangoFilterBackend]
    filterset_fields = '__all__'

    def get_queryset(self):
        model = ALLOWED_ENTITIES[self.kwargs['entity_name']][0]
        self.filterset_fields = ALLOWED_ENTITIES[self.kwargs['entity_name']][2]
        return model.objects.all()

    def get_serializer_class(self):
        serializer = ALLOWED_ENTITIES[self.kwargs['entity_name']][1]
        return serializer