You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 23:34:58