RuntimeError: Model class django.contrib.contenttypes.models.ContentType doesn't declare an explicit app_label and isn't in an application in INSTALLED_APPS.
from rest_framework import viewsets
from .models import Department, Role, User, Permission
from .serializers import DepartmentSerializer, RoleSerializer, UserSerializer, PermissionSerializer
class DepartmentViewSet(viewsets.ModelViewSet):
queryset = Department.objects.all()
serializer_class = DepartmentSerializer
此错误在使用视图集的时候出现
原因注释了settings.py里的
'django.contrib.auth',
'django.contrib.contenttypes',
目前看来想使用视图集必须有这俩,但是这俩存在的话迁移数据库的时候就会出现多出一些表的问题
django.contrib.auth
和 django.contrib.contenttypes
是 Django REST Framework(DRF)视图集默认行为的基础依赖。它们一旦启用,迁移时就会生成一堆和用户、权限相关的表,比如:
-
auth_user
-
auth_group
-
auth_permission
-
django_content_type
🧩 为什么视图集依赖这两个?
DRF 的 ModelViewSet
默认启用了认证和权限机制,比如:
-
request.user
(依赖auth
) -
IsAuthenticated
、IsAdminUser
等权限类(依赖auth
和contenttypes
)
哪怕你没用这些功能,只要没显式关闭,DRF 还是会尝试访问它们。
✅ 解决方案:保留 app,避免生成多余表
你可以保留 auth
和 contenttypes
,但通过以下方式避免它们生成表或干扰你的数据库结构:
方法一:关闭默认认证和权限机制
在 settings.py
中添加:
REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': [],
'DEFAULT_PERMISSION_CLASSES': [],
}
这样 DRF 就不会用到 auth_user
或权限表,虽然它们仍然存在,但不会被用到。
方法二:使用 --empty
创建迁移文件(不包含模型变更)
如果你不想让这些 app 的表出现在你的数据库里,可以:
python manage.py migrate --exclude auth --exclude contenttypes
注意:这不是官方参数,Django 原生不支持
--exclude
,但你可以用third-party migration tools 或手动控制迁移。
更常见的做法是:
python manage.py migrate your_app_name
只迁移你自己的 app,不迁移 auth
和 contenttypes
。
方法三:使用自定义用户模型(高级方案)
如果你确实需要用户系统但不想用 Django 默认的 auth_user
表,可以自定义用户模型:
# user_permission/models.py
from django.contrib.auth.models import AbstractBaseUser
class CustomUser(AbstractBaseUser):
# 自定义字段
pass
然后在 settings.py
中指定:
AUTH_USER_MODEL = 'user_permission.CustomUser'
不过这会引入更多复杂性,不建议在纯 API 项目中使用,除非你真的需要用户系统。
🧼 总结推荐方案
如果你只是想用 DRF 的视图集功能,不需要用户认证:
-
保留
'django.contrib.auth'
和'django.contrib.contenttypes'
-
设置 DRF 不使用认证和权限类
-
只迁移你自己的 app,忽略系统 app 的表
这样你既能用视图集,又能保持数据库干净整洁。