Django exclude字段来自ModelViewSet的Django FilterBackend中的“\uuuu all\uuuuuuuuu”

2024-10-03 02:41:12 发布

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

我有多个API类ModelViewSet,它们是从一个公共ViewSet继承的。 因此,有不同类型的模型,它们有自己的字段,但都共享公共viewset中定义的相同特性

其中一个特性是过滤。看起来是这样的:

class CommonViewSet(viewsets.ModelViewSet):
    filter_backends = (DjangoFilterBackend,)
    filter_fields = '__all__'

class FirstViewSet(CommonViewSet):
    model = FirstModel

class SecondViewSet(CommonViewSet):
    model = SecondModel

# etc...

每个模型都有一组不同的字段,除了每个模型都有一个公共字段user。我不想让这个领域以任何方式暴露出来

我已从序列化程序中排除此字段:

class CommonSerializer(serializers.ModelSerializer):
    class Meta:
        exclude = ('user',)

class SecondSerializer(CommonSerializer):
    class Meta:
        model = FirstModel

# etc...

我想要实现的是也从{}的{}中排除{}字段。即:

filter_fields = '__all__' # except 'user'

有没有一个标准的方法可以做到这一点


Tags: 模型apifieldsmodeletc特性allfilter
1条回答
网友
1楼 · 发布于 2024-10-03 02:41:12

我自己找到了解决办法

为此,我定义了CustomFilterBackend,它用filter_exclude扩展了DjangoFilterBackend的功能:

class CustomFilterBackend(DjangoFilterBackend):
    def get_filterset_class(self, view, queryset=None):
        filterset = super().get_filterset_class(view, queryset)
        
        filter_exclude = getattr(view, 'filter_exclude', None)
        for x in filter_exclude:
            filterset.base_filters.pop(x, None)
        return filterset

因此,通过这种过滤器后端,我可以在我的ModelViewSet上为排除的字段定义额外的字段:

class UserCustomViewSet(viewsets.ModelViewSet):
    filter_backends = (CustomFilterBackend,)
    filter_fields = '__all__'
    filter_exclude = ('user',)

相关问题 更多 >