【问题标题】:Django-filters how to create dynamically filterset_fieldsDjango-filters如何动态创建filterset_fields
【发布时间】:2020-09-15 08:49:41
【问题描述】:

我写了一个视图集,它依赖于端点:

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

提前谢谢你。

【问题讨论】:

    标签: python python-3.x django django-filter django-filters


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2019-03-25
      • 1970-01-01
      • 2020-08-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-17
      • 2018-01-31
      • 1970-01-01
      相关资源
      最近更新 更多