问题描述
我编写了一个视点集,该视点集取决于端点:
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