Skip to content

Latest commit

 

History

History

generic

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

如何在项目中期切换到自定义用户模型

测试流程

  1. 创建有User依赖的模型

  2. 迁移

  3. 添加数据

迁移流程

本项目已写好了主要迁移内容,操作请参考完整迁移流程

  1. 首先将2,3步恢复到指定状态

  2. 执行7,8,9步

  3. 根据需要执行第11步或直接迁移

完整迁移流程

  1. 创建新应用(下文中默认新应用名为generic) python manage.py startapp generic
  2. 向新应用的models文件添加以下内容
from django.contrib.auth.models import AbstractUser

class User(AbstractUser):
    class Meta:
        db_table = 'auth_user'
  1. 检查apps中默认自增字段设置(否则可能生成错误的迁移文件) default_auto_field = 'django.db.models.AutoField'

  2. 添加到INSTALLED_APP(settings.py中)

INSTALLED_APPS = [
    ...,
    'generic',
]
  1. 设置认证User模型(settings.py中,建议放在INSTALLED_APPS后) AUTH_USER_MODEL = 'generic.User' 否则创建初始迁移可能报错

  2. 将所有原先的User模型关系改为新的User或settings.AUTH_USER_MODEL 否则创建初始迁移可能报错

  3. 创建初始迁移(此时User必须只包含了Meta信息而没有其它字段,且apps设置正确) python manage.py makemigrations generic 创建迁移名应为0001_initial.py,与第10步保持一致 如果不是初始迁移,请检查是否出现异常,删除迁移文件后重试

  4. 标记迁移已应用

    • 数据库 在django_migrations表添加一行(generic, 0001_initial, CURRENT_TIMESTAMP)
    • django(不可用,会提示InconsistentMigrationHistory,admin迁移已应用) python manage.py migrate generic --fake-initial
  5. 纠正contenttype表

    • 在数据库中,将django_content_type表中app_label列为auth且model列为user的行app_label改为generic

    • 或者运行

      from django.contrib.contenttypes.models import ContentType
      my_app_label = # 'generic'
      ContentType.objects.filter(app_label='auth', model='user').update(app_label=my_app_label)
  6. 补充其它自定义功能

    • 添加后台(替换模型后User后台自动失效)

      from django.contrib.auth.admin import UserAdmin
      
      admin.site.register(User, UserAdmin)
    • 自定义管理器

      from django.contrib.auth.models import UserManager as _UserManager
      class UserManager(_UserManager):
          pass
  7. 重命名用户表或修改自增字段

    class User(AbstractUser):
        class Meta:
            # db_table = 'auth_user'
            pass

    修改后,运行

    python manage.py makemigrations generic --name rename_user_table
    python manage.py migrate generic

    若有必要可以将default_auto_field改为BigAutoField,然后类似操作

参考