Django rest framework 使用DjangoRestMultipleModels进行过滤
根据DjangoREST框架的“默认过滤器后端开箱即用”和DjangoRESTMultipleModel。因此,我希望以下代码能够正常工作: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','
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中就可以了