django解决自定义用户验证模型类时报错--django.db.migrations.exceptions.InconsistentMigrationHistory

使用场景:

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.更改表名

在这里插入图片描述
在这里插入图片描述

到此結束,感謝閲讀~~~~~~~~~~~~~
小白自学,各路神仙勿喷

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值