
在 Django REST Framework (DRF) 项目中Swagger (drf-yasg) 解析get_queryset()时如果get_queryset()返回list而不是QuerySet会导致AttributeError: list object has no attribute model错误。本文记录该问题的调试过程及最终解决方案。Traceback(most recent call last):FileG:\MyGitProject\venv\dv3admin\lib\site-packages\rest_framework\views.py,line506,indispatch responsehandler(request,*args,**kwargs)FileG:\MyGitProject\venv\dv3admin\lib\site-packages\drf_yasg\views.py,line96,inget schemagenerator.get_schema(request,self.public)FileG:\MyGitProject\MyTools\MyToolsBak\MyToolsBak-HostServer\dvadmin\utils\swagger.py,line39,inget_schema swaggersuper().get_schema(request,public)FileG:\MyGitProject\venv\dv3admin\lib\site-packages\drf_yasg\generators.py,line276,inget_schema paths,prefixself.get_paths(endpoints,components,request,public)FileG:\MyGitProject\venv\dv3admin\lib\site-packages\drf_yasg\generators.py,line482,inget_paths operationself.get_operation(view,path,prefix,method,components,request)FileG:\MyGitProject\venv\dv3admin\lib\site-packages\drf_yasg\generators.py,line524,inget_operation operationview_inspector.get_operation(operation_keys)FileG:\MyGitProject\venv\dv3admin\lib\site-packages\drf_yasg\inspectors\view.py,line33,inget_operation queryself.get_query_parameters()FileG:\MyGitProject\venv\dv3admin\lib\site-packages\drf_yasg\inspectors\view.py,line293,inget_query_parameters natural_parametersself.get_filter_parameters()self.get_pagination_parameters()FileG:\MyGitProject\venv\dv3admin\lib\site-packages\drf_yasg\inspectors\base.py,line409,inget_filter_parameters fieldsself.probe_inspectors(self.filter_inspectors,get_filter_parameters,filter_backend())or[]FileG:\MyGitProject\venv\dv3admin\lib\site-packages\drf_yasg\inspectors\base.py,line110,inprobe_inspectors resultmethod(obj,**kwargs)FileG:\MyGitProject\venv\dv3admin\lib\site-packages\drf_yasg\inspectors\query.py,line42,inget_filter_parametersreturnlist(map(self.param_to_schema,filter_backend.get_schema_operation_parameters(self.view)))FileG:\MyGitProject\venv\dv3admin\lib\site-packages\django_filters\rest_framework\backends.py,line146,inget_schema_operation_parameters filterset_classself.get_filterset_class(view,queryset)FileG:\MyGitProject\venv\dv3admin\lib\site-packages\django_filters\rest_framework\backends.py,line40,inget_filterset_class queryset.model,filterset_model AttributeError:listobjecthas no attributemodel该错误发生在drf-yasg解析 Swagger API 文档时表明某个ViewSet的get_queryset()方法返回了list而 Swagger 期望QuerySet。错误代码示例# ❌ 错误示例返回 listdefget_queryset(self):fixed_ids[11,12]fixed_recordsArticleTag.objects.filter(id__infixed_ids)remaining_recordsArticleTag.objects.exclude(id__infixed_ids)random_recordsremaining_records.order_by(?)[:5]querysetlist(fixed_records)list(random_records)# ❌ 把 QuerySet 变成了 listreturnqueryset# ❌ Swagger 解析失败比如我的代码里是这样的仔细看发布时发现问题了。defget_queryset(self):# 获取固定的记录fixed_ids[11,12]fixed_recordsArticleTag.objects.filter(id__infixed_ids)# 获取其余的记录remaining_recordsArticleTag.objects.exclude(id__infixed_ids)# 随机选择5个记录random_recordsremaining_records.order_by(?)[:5]# 合并固定记录和随机记录querysetlist(fixed_records)list(random_records)returnqueryset确保get_queryset()返回QuerySet使用union()合并多个QuerySet# ✅ 正确示例使用 union()defget_queryset(self):fixed_ids[11,12]fixed_recordsArticleTag.objects.filter(id__infixed_ids)remaining_recordsArticleTag.objects.exclude(id__infixed_ids)random_recordsremaining_records.order_by(?)[:5]querysetfixed_records.union(random_records)# ✅ 确保返回 QuerySetreturnqueryset✅union()组合两个QuerySet避免list类型错误。如何调试get_queryset()返回类型手动打印get_queryset()返回值类型# 在所有 ViewSet 里加入调试代码importlogging loggerlogging.getLogger(__name__)defget_queryset(self):querysetArticleTag.objects.all()logger.debug(f 调试:{self.__class__.__name__}.get_queryset() 返回{type(queryset)})returnqueryset执行 Swagger 请求 (http://127.0.0.1:8000/swagger.json) 后检查django.log里打印的queryset类型。在 Django Shell 里手动测试python manage.py shell然后执行fromapp.viewsimportExampleViewSet viewExampleViewSet()print(type(view.get_queryset()))# 如果输出 class list说明有问题如果get_queryset()返回list则需要修改代码确保它返回QuerySet。✅ 其他常见问题 解决方案问题错误代码解决方案get_queryset()直接返回了listreturn list(queryset)改成QuerySet如queryset.union(another_queryset).values()或.values_list(..., flatTrue)可能导致listqueryset.values(field)改成.values_list(field, flatTrue)解析 Swagger 时找不到出错的 APIswagger.py解析失败在swagger.py里logger.error(Swagger 解析失败: {e})Django Shell 运行view.get_queryset()发现返回listpython manage.py shell修复get_queryset()确保返回QuerySet总结如何防止AttributeError: list object has no attribute model错误1️⃣确保get_queryset()返回QuerySet而不是list2️⃣使用union()代替list list3️⃣检查.values()是否返回list改成.values_list(..., flatTrue)4️⃣用print(type(queryset))或 Django Shell 调试这样Swagger 解析不会再出错API 文档可以正常生成