今天,在自己练习写django框架时,自定义了User类。
可以看到,这样的代码是一点错都没有的,但是却出了这样一个错误。
这让我很无奈,不明白为什么会出现这样的错误,但是我大概知道是因为继承了AbstractUser的原因,于是接下来我看了源码。
我查到了系统的User,是这样的。
这么短的的代码,就有一点值得我在意,那个全部大写的东西,我们在setting中知道,全大写的东西一般都是系统定义好的,我决定看看这个东西代表什么。
在这个路径下
我找到了这个系统帮我们定义好的变量。
哎呦,这个东西看着很眼熟哎,auth不是那个app名字么,User不是auth中models里面的那个类吗,这就有点意思了。
我们首先了解下当我们迁移数据库时的过程,当我们执行迁移后,只会走自己写的app,那些已经被迁移过了,我们是不是可以这样猜想,django知道你可能会重新编写自带的User,就在auth中的User里留下了印记,这个印记是谁,就加载谁,这也是为了防止你在数据库中有两个几乎一样的表,没必要。
当你在自己写的app中重新继承后,django就大概明白你的意思了,你丫的是想重写这个方法啊,那我帮你把门,防止你忘记改印记,所以当你忘记改印记时,并且还重写了以后,就会出错,让你记起你没有把标记改了。但是如果你没改标记,还没运行,直接上传mysql后,你在数据库里存在的表就是系统自带的User,他会先走auth,发现印记没改,就把这个表给弄下来了,你后来的继承就不给搞了。
简单来说,当执行加载到auth的User后,他说,你印记都改了,要我去找xx应用的User吧,然后系统就加载了那个xx应用的User。
最后说一下怎么改那个变量名。
在setting重新给那个变量赋值就好了。值是什么呢,从他自带的那个我们大概就明白了,是app名.类名。
只是个人理解,忘各位斧正。