基于DRF实现多模型搜索接口遇分页器报错,求解决方案
问题原因分析
FlatMultipleModelAPIView的核心作用是返回多个模型的数据集,它的响应结构和普通DRF视图(仅处理单一模型查询集)完全不同。普通DRF或Django分页器仅针对单一查询集设计,没有适配多模型响应的format_response方法,而该视图要求分页器必须具备这个方法来正确格式化多模型的分页结果,因此抛出了上述错误。
解决方法
方法一:使用库内置的适配分页器
DjangoRestMultipleModels库提供了专门适配多模型视图的分页器,直接导入并指定即可解决问题:
- 导入分页器:
from drf_multiple_models.pagination import FlatPageNumberPagination
- 在视图类中指定分页器,并修正原代码中else分支的结构错误(原分支返回格式不符合querylist要求):
class DataSearch(FlatMultipleModelAPIView): pagination_class = FlatPageNumberPagination # 指定库自带的分页器 def get_querylist(self): q = self.request.query_params.get('query') if q: vector_data = SearchVector('research', 'data', 'research__name') vector_var = SearchVector('label') query = SearchQuery(q, search_type='websearch') querylist = [ { 'queryset': Data.objects.annotate(search=vector_data).filter(search=query), 'serializer_class': DataSerializer }, { 'queryset': Variable.objects.annotate(search=vector_var).filter(search=query), 'serializer_class': VariableSerializer } ] else: # 保持querylist结构一致,返回空查询集和对应序列化器 querylist = [ { 'queryset': Data.objects.none(), 'serializer_class': DataSerializer }, { 'queryset': Variable.objects.none(), 'serializer_class': VariableSerializer } ] return querylist
方法二:自定义兼容分页器
如果需要自定义分页逻辑,可继承DRF分页器和库中的BaseMultipleModelPagination基类(自动继承format_response方法):
from rest_framework.pagination import PageNumberPagination from drf_multiple_models.pagination import BaseMultipleModelPagination class CustomFlatPaginator(PageNumberPagination, BaseMultipleModelPagination): page_size = 10 # 自定义每页数据量 page_size_query_param = 'page_size' max_page_size = 100
之后在视图类中指定pagination_class = CustomFlatPaginator即可。
内容的提问来源于stack exchange,提问作者Iggy Comdore
相关产品推荐
相关产品推荐

