Django用戶認證模塊中繼承AbstractUser與AbstractBaseUser重寫User表的區別

AbstractUser和AbstractBaseUser看起來十分類似,若是你不熟悉djiango的auth重寫User,那你很容易弄錯,致使一堆bug。python

 

 

 

咱們查看AbstractUser的源碼得知,AbstractUser繼承了AbstractBaseUser,講得俗氣一點就是,AbstractBaseUser是AbstractUser的爸爸。數據庫

 

 

咱們能夠猜測一下,既然兩者是繼承與被繼承關係,那麼AbstractUser是否是在AbstractBaseUser的基礎上功能更加完善呢?AbstractBaseUser是否是更加open呢?django

經過官方文檔咱們能夠獲得答案:app

AbstractUserui

         The documentation explains this fully. AbstractUser is a full User model, complete with fields, as an abstract class so that you can inherit from it and add your own profile fields and methods. AbstractBaseUser only contains the authentication functionality, but no actual fields: you have to supply them when you subclass.this

文檔充分解釋了這一點。 AbstractUser是一個完整的用戶模型,包含字段,做爲一個抽象類,以便您能夠繼承它並添加您本身的配置文件字段和方法。 AbstractBaseUser僅包含身份驗證功能,但不包含實際字段:當您繼承子類時,您必須提供它們。spa

         The AbstractUser is basically just the "User" class you're probably already used to. AbstractBaseUser makes fewer assumptions and you have to tell it what field represents the username, what fields are required, and how to manage those users.命令行

AbstractUser基本上就是您可能已經習慣的「用戶」類。 AbstractBaseUser的繼承較少,您必須告訴它哪一個字段表明用戶名,須要哪些字段以及如何管理這些用戶。code

AbstractBaseUser            blog

            If you're just adding things to the existing user (i.e. profile data with extra fields), then use AbstractUser because it's simpler and easier. If you want to rethink some of Django's assumptions about authentication, then AbstractBaseUser gives you the power to do so.

若是您只是將事情添加到現有用戶(即具備額外字段的配置文件數據),則使用AbstractUser是由於它更簡單,更簡單。 若是您想從新考慮一下Django關於認證的假設,那麼AbstractBaseUser會爲您提供這樣的權力。

什麼意思呢?就是說啊,咱們習慣的繼承 的AbstractUser 類是高度集成的,裏面給你定義了一堆的字段,不須要你人爲去定義了。

上面是咱們須要額外添加的,下面是django幫你作的(沒有顯示徹底,右邊還有本身添加的部分字段)

 

 

 

但回過頭來想,高度集成的東西每每擴展性和兼容性就較差,萬一哪天一個項目來了說我只須要基本的用戶名密碼,用戶類型等等三四個字段,其餘的都不care,那麼很顯然這時候用AbstractUser  是不合理的,將形成數據庫資源的浪費,下降數據庫效率。

這時候咱們就能夠來繼承AbstractBaseUser  類來自定義一些字段。下面咱們來看看AbstractBaseUser  的用法

 model

建立後的全部表字段

 

 因而可知,django只幫咱們建立了id、password、last_login這三個字段。

在模型類中咱們必須定義一個用戶名字段,並指定屬性爲unique,而後告訴django這個字段是用戶名字段:

    username = models.CharField(max_length=32,unique=True)
    USERNAME_FIELD = 'username'

    # 這當中的username你能夠任意命名,unique必須指定爲True

若是不寫這兩句話,你會發現執行數據庫遷移命令怎麼建立表都沒辦法建立出來,一直報錯:

AttributeError: type object 'UserInfo' has no attribute 'USERNAME_FIELD'

 

 

若是你要刪庫從新建model,請到你的app下面的migrations文件夾下面把除__init__.py的其餘文件所有刪除,再執行數據庫遷移命令。

順帶把數據庫遷移命令語句丟在這兒:

第一種方式:PyCharm的Terminal命令行:

第一條:python  manage.py makemigrations  或者 python3 manage.py makemigrations   ###根據你配置的python環境而定

第二條:python manage.py migrate    或者 python3 manage.py migrate

 

 

 第二種方式:PyCharm上菜單欄Tools --> run manage.py Task...  

第一條:makemigrations 
第二條:migrate

 

 

 

 以爲寫得好,給個讚唄~~~~~~歡迎來摟~~

相關文章
相關標籤/搜索