Djangofilters如何动态创建filterset_字段

2024-05-19 10:08:06 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

URL.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模型和PersonSerializer的viewset,这与预期的一样

但是问题是,我不知道如何定义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

先谢谢你


Tags: nameselfapiurlfieldsgetallkwargs
1条回答
网友
1楼 · 发布于 2024-05-19 10:08:06

我找到了答案,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

相关问题 更多 >

    热门问题