使用DjangoRestMultipleModels过滤

时间:2017-03-20 12:04:22

标签: django-rest-framework

根据the relevant documentation" Django Rest框架默认过滤后端工作开箱即用"使用DjangoRestMultipleModels。因此,我希望以下代码能够正常运行:

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_fields,那么我会受到欢迎:

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

欢迎任何有关此处可能出现问题的建议。

1 个答案:

答案 0 :(得分:0)

最后,我必须解决以下问题:

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即可。