使用场景:
Django自定义用户模型类
有些项目可能会有认证需求,而 Django 内置的 User 模型并不总是合适。如Django自带的模型类中不包括我们需要的字段,这时我们就需要自定义User模型类:
我这里自定义的User模型类
问题描述
迁移模型类到数据库时出错
在迁移模型类的时候报InconsistentMigrationHistory错误:
原因分析:
报错代码大概的意思就是说admin.0001_initial这个迁移文件,应该在users.0001_initial这个迁移文件之后被应用:
迁移顺序:
我们在对生成的迁移文件进行迁移的时候,Django 不是通过迁移的名字决定迁移执行顺序,而是通过在迁移类上使用两个属性: dependencies 和 run_before。
我刚生成的users.0001_initial这个迁移文件就是依赖于auth子应用下的0012_alter_user_first_name_max_length这个迁移文件,也就是说当前我的迁移文件要在0012_alter_user_first_name_max_length这个迁移文件被应用之后应用,才是一个正确的迁移顺序
查看迁移迁移表:
从数据库中的迁移记录可以看出我在创建Django项目之后就对Django默认的User用户模型迁移文件进行了迁移操作,并且也迁移了其他的模型类,也能看出admin子应用下的0001_initial这个迁移文件是在auth子应用下的0001_initial迁移文件之后应用,而现在我在创建的users子应用下自定义了User用户模型类,并也在配置文件中指定了默认的验证User模型类为我自己定义的模型类
而我准备迁移当前我自己定义的User模型类时,admin下的0001.initial都已经被应用,所以现在再迁移当前我自定义的User模型类就出现了迁移顺序混乱的问题
解决方案:
场景一:
在你新建Django项目时,从未进行迁移操作前,就自定义用户模型类,这也是官方文档推荐的。
场景二:如上
解决方法一(删除所有的表,迁移文件):
1.删除数据库中所有的表
2.删除所有自己创建的应用下的migrations下的迁移文件
3.重新进行迁移操作
解决方法二(不用删表,迁移文件):
1.将自定义的User模型类tb_table字段改为auth_user
from django.contrib.auth.models import AbstractUser
from django.db import models
class User(AbstractUser):
class Meta:
db_table = 'auth_user'#这里更改
2.配置文件指定,生成迁移文件
AUTH_USER_MODEL = 'users.User'
3.通过手动更改将User的初始迁移文件添加到迁移历史记录中(20行我自己添加的):
4.更新django_content_types表中app_label=auth,model=user的那条记录,将app_label更改为user
5.进行migrate迁移数据表操作(没有报错)
6.在自定义的User模型上添加字段,
from django.contrib.auth.models import AbstractUser
from django.db import models
class User(AbstractUser):
mobile = models.CharField(max_length=11, unique=True, verbose_name='手机号码', null=True, blank=True)#新建字段
class Meta:
db_table = 'auth_user'
7.生成迁移文件,进行迁移操作
8.查看表(相比之前多了mobile字段)
9.更改表名
到此結束,感謝閲讀~~~~~~~~~~~~~
小白自学,各路神仙勿喷