Django auth 採用自己的 models 做使用者登入在check時的問題。

起因:

Django原生有提供一套讓使用者做註冊與登入的方法跟架構(django.contrib.auth.models內),但是有些時候我們會改用自己的models來做使用者登入與註冊的流程~例如:django 是用user name當作使用者帳號,但是我想用email當作使用者帳號就沒辦法用django原生的架構

系統:

Ubunut 16.04
Django 1.11
python3


架構:

MyProject
|--------MyUser
|                |-------models.py
|                |------- .........
|
|--------myproject
|                |-------settings.py
|                |------- .........
|
|--------manage.py

簡單的說就是先用django-admin 生 MyProject然後再到目錄下用python manage 生 app(MyUser)然後我的使用者Database架構會寫在MyUser下的models.py內(記得settings.py內的INSTALLED_APPS要加入MyUser)。

以下是我的部份 User model code :
class User(AbstractBaseUser, PermissionsMixin):
    email = models.EmailField(
        _('email'), max_length=254, unique=True,
        help_text=_(
            'Required ! 254 or fewer, Letter ,digits and @/./-/_ only.'
        ))  # end of email setting

    biotrump_id = models.CharField(
        default=uuid.uuid4,
        editable=False,
        max_length=254,
        db_index=True)

    name = models.CharField(_('User name'), max_length=100)

    first_name = models.CharField(_('first name'), max_length=100)
    last_name = models.CharField(_('last name'), max_length=100)
    sex = models.CharField(_('sex'), max_length=1, null=True, blank=True)
    register_date = models.DateField(auto_now_add=True)
    modify_date = models.DateField(auto_now=True)
    avatar = models.ImageField(
        _('Avatar'), max_length=254, null=True, upload_to=generate_avatar_path
    )
.....
.....

當我們寫完自己的使用者架構後使用 $ python manage.py check 時會遇到下面出現的錯誤:


這是因為我的User是繼承AbstractBaseUserPermissionsMixin這兩個原生的物件,然而在Django預設會去用原生的使用者架構來建立database並且原生的使用者架構也是繼承AbstractBaseUserPermissionsMixin這邊就出現兩邊再做有關Group反查時都遇到名字都叫做User.groups的related_name 會讓Django在Query的時候會搞亂。因此要告知Django採用我自己的使用者架構而不要去管內建的那套就不會出現錯誤!

解法:

在settings.py內 加入 AUTH_USER_MODEL = 'MyUser.User' 告訴Django 使用者登入與註冊model改用MyUser 這個app 的 models內的User這個物件。這時候 $ python manage.py check 就應該會pass了。

然後在真正要migrate之前要先做makemigrations 把資料架構與版本建立。

$ python manage makemigrations MyUser

接著再做 migrate 就可以把我們的使用者架構正確的建立在Database內。

$ python manage migrate


留言