使用drf_yasg生成API文档时遇Model无_meta属性错误求助
使用drf_yasg生成API文档时出现AttributeError错误
我们正在使用drf_yasg生成API文档,预期可通过localhost/docs/访问该文档,但目前无法正常显示,触发错误:AttributeError: module 'appname.models.TermsAndConditions' has no attribute '_meta'
完整报错回溯
Traceback (most recent call last): File "D:\Work Folder\appname\env\lib\site-packages\django\core\handlers\exception.py", line 47, in inner response = get_response(request) File "D:\Work Folder\appname\env\lib\site-packages\django\core\handlers\base.py", line 179, in _get_response response = wrapped_callback(request, *callback_args, **callback_kwargs) File "D:\Work Folder\appname\env\lib\site-packages\django\views\decorators\csrf.py", line 54, in wrapped_view return view_func(*args, **kwargs) File "D:\Work Folder\appname\env\lib\site-packages\django\views\generic\base.py", line 73, in view return self.dispatch(request, *args, **kwargs) File "D:\Work Folder\appname\env\lib\site-packages\rest_framework\views.py", line 505, in dispatch response = self.handle_exception(exc) File "D:\Work Folder\appname\env\lib\site-packages\rest_framework\views.py", line 465, in handle_exception self.raise_uncaught_exception(exc) File "D:\Work Folder\appname\env\lib\site-packages\rest_framework\views.py", line 476, in raise_uncaught_exception raise exc File "D:\Work Folder\appname\env\lib\site-packages\rest_framework\views.py", line 502, in dispatch response = handler(request, *args, **kwargs) File "D:\Work Folder\appname\env\lib\site-packages\drf_yasg\views.py", line 94, in get schema = generator.get_schema(request, self.public) File "D:\Work Folder\appname\api\urls.py", line 17, in get_schema schema = super().get_schema(request, public) File "D:\Work Folder\appname\env\lib\site-packages\drf_yasg\generators.py", line 254, in get_schema paths, prefix = self.get_paths(endpoints, components, request, public) File "D:\Work Folder\appname\env\lib\site-packages\drf_yasg\generators.py", line 412, in get_paths operation = self.get_operation(view, path, prefix, method, components, request) File "D:\Work Folder\appname\env\lib\site-packages\drf_yasg\generators.py", line 454, in get_operation operation = view_inspector.get_operation(operation_keys) File "D:\Work Folder\appname\env\lib\site-packages\drf_yasg\inspectors\view.py", line 45, in get_operation responses = self.get_responses() File "D:\Work Folder\appname\env\lib\site-packages\drf_yasg\inspectors\view.py", line 180, in get_responses response_serializers = self.get_response_serializers() File "D:\Work Folder\appname\env\lib\site-packages\drf_yasg\inspectors\view.py", line 235, in get_response_serializers responses = self.get_default_responses() File "D:\Work Folder\appname\env\lib\site-packages\drf_yasg\inspectors\view.py", line 211, in get_default_responses default_schema = self.serializer_to_schema(default_schema) or '' File "D:\Work Folder\appname\env\lib\site-packages\drf_yasg\inspectors\base.py", line 445, in serializer_to_schema return self.probe_inspectors( File "D:\Work Folder\appname\env\lib\site-packages\drf_yasg\inspectors\base.py", line 118, in probe_inspectors result = method(obj, **kwargs) File "D:\Work Folder\appname\env\lib\site-packages\drf_yasg\inspectors\field.py", line 42, in get_schema return self.probe_field_inspectors(serializer, openapi.Schema, self.use_definitions) File "D:\Work Folder\appname\env\lib\site-packages\drf_yasg\inspectors\base.py", line 236, in probe_field_inspectors return self.probe_inspectors( File "D:\Work Folder\appname\env\lib\site-packages\drf_yasg\inspectors\base.py", line 118, in probe_inspectors result = method(obj, **kwargs) File "D:\Work Folder\appname\env\lib\site-packages\drf_yasg\inspectors\field.py", line 135, in field_to_swagger_object actual_schema = definitions.setdefault(ref_name, make_schema_definition) File "D:\Work Folder\appname\env\lib\site-packages\drf_yasg\openapi.py", line 690, in setdefault ret = maker() File "D:\Work Folder\appname\env\lib\site-packages\drf_yasg\inspectors\field.py", line 102, in make_schema_definition for property_name, child in serializer.fields.items(): File "D:\Work Folder\appname\env\lib\site-packages\django\utils\functional.py", line 48, in __get__ res = instance.__dict__[self.name] = self.func(instance) File "D:\Work Folder\appname\env\lib\site-packages\rest_framework\serializers.py", line 363, in fields for key, value in self.get_fields().items(): File "D:\Work Folder\appname\env\lib\site-packages\rest_framework\serializers.py", line 1037, in get_fields info = model_meta.get_field_info(model) File "D:\Work Folder\appname\env\lib\site-packages\rest_framework\utils\model_meta.py", line 35, in get_field_info opts = model._meta.concrete_model._meta AttributeError: module 'appname.models.TermsAndConditions' has no attribute '_meta' ERROR basehttp.basehttp.py:log_message:157 > "GET /api/v1/docs/?format=openapi HTTP/1.1" 500 228599
相关代码
Models.py
class TermsAndCondition(TimeStampedModel): company = models.ForeignKey(Company, related_name='terms_and_conditions', on_delete=models.CASCADE, blank=True, null=True) pdfUpload = models.FileField(upload_to=pdf_path, max_length=None, blank=True, null=True) def __str__(self): return self.company.name class Meta: app_label = "applicationname"
TimeStampedModel
class TimeStampedModel(models.Model): created_at = models.DateTimeField(auto_now_add=True) modified_at = models.DateTimeField(auto_now=True) class Meta: abstract = True
URLS.py
from django.urls import include, path, re_path from drf_yasg.views import get_schema_view from drf_yasg import openapi schema_view = get_schema_view( openapi.Info( title="appName", default_version='v1', description="", terms_of_service="https://apptitude.xyz/terms-of-use/", contact=openapi.Contact(email="admin@apptitude.xyz"), license=openapi.License(name="BSD License"), ), generator_class=BothHttpAndHttpsSchemaGenerator, public=True, permission_classes=(permissions.AllowAny,), ) urlpatterns = [ path('docs/', schema_view.with_ui('swagger', cache_timeout=0), name='schema-swagger-ui'), ]
解决思路
- 修正类名拼写不一致问题:报错中提到的
TermsAndConditions(带末尾s)和实际Model类名TermsAndCondition(不带末尾s)不匹配。这是核心原因——当序列化器或视图中错误引用了TermsAndConditions时,Python会把它当成模块而非Model类,模块自然没有_meta属性。检查所有序列化器、视图文件,将Model引用统一为TermsAndCondition。 - 确认Model继承与注册:确保
TermsAndCondition继承的TimeStampedModel是正确的抽象Model,同时applicationname这个app已经在settings.py的INSTALLED_APPS中注册,否则Django无法正确识别Model。 - 检查序列化器配置:查看对应Model的序列化器,确认
model字段的值是正确的TermsAndCondition,而非拼写错误的TermsAndConditions。 - 清理缓存并重启服务:运行
python manage.py clearcache清理Django缓存,然后重启开发服务器,避免缓存导致的类引用异常。
内容的提问来源于stack exchange,提问作者KBalane
相关产品推荐
相关产品推荐

