Django rest framework 使用DjangoRestMultipleModels进行过滤

Django rest framework 使用DjangoRestMultipleModels进行过滤,django-rest-framework,Django Rest Framework,根据DjangoREST框架的“默认过滤器后端开箱即用”和DjangoRESTMultipleModel。因此,我希望以下代码能够正常工作: class AllModelSummary(MultipleModelAPIView): filter_backends = (SearchFilter,DjangoFilterBackend,) search_fields = ('name','description',) #filter_fields = ('is_foo','

根据DjangoREST框架的“默认过滤器后端开箱即用”和DjangoRESTMultipleModel。因此,我希望以下代码能够正常工作:

class AllModelSummary(MultipleModelAPIView):
    filter_backends = (SearchFilter,DjangoFilterBackend,)
    search_fields = ('name','description',)
    #filter_fields = ('is_foo','is_bar',) # Everything breaks when this is uncommmented
    flat = True

    def get_queryList(self):
        queryList = (
            (Foo.objects.all(), FooSerializerMiniList),
            (Bar.objects.all(), BarSerializerMiniList)
        )

        return queryList

    def get(self, request, *args, **kwargs):
        return self.list(request, *args, **kwargs)
下面是其中一个序列化程序的示例:

class BarSerializerMiniList(serializers.ModelSerializer):
    is_foo = serializers.SerializerMethodField()
    is_bar = serializers.SerializerMethodField()

    def get_is_foo(self,obj):
        return False

    def get_is_bar(self,obj):
        return True

    class Meta:
        model = Bar
        fields = ('pk','name','description','is_bar','is_foo')
搜索字段完全按照它们应该执行的操作,但是如果我在API中定义了
filter\u字段
,那么我会遇到以下问题:

'Meta.fields' contains fields that are not defined on this FilterSet: is_foo, is_bar

任何关于这里可能出现的问题的建议都是受欢迎的。

最后,我不得不解决这个问题,如下所示:

class AllModelSummary(MultipleModelAPIView):
    ...
    def get_querylist(self):
        types = self.request.query_params['types']
        queryList = ()
        if types:
            for t in types.split(','):
                if t == 'foo':
                    queryList = queryList + ((Foo.objects.all(), FooSerializerMiniList),)
                elif t == 'bar':
                    queryList = queryList + ((Bar.objects.all(), BarSerializerMiniList),)
        else:
            queryList = (
                (Foo.objects.all(), FooSerializerMiniList),
                (Bar.objects.all(), BarSerializerMiniList),
            )

        return queryList
然后,将
?types=foo,bar
附加到URL中就可以了