起因:
Django原生有提供一套讓使用者做註冊與登入的方法跟架構(django.contrib.auth.models內),但是有些時候我們會改用自己的models來做使用者登入與註冊的流程~例如:django 是用user name當作使用者帳號,但是我想用email當作使用者帳號就沒辦法用django原生的架構。系統:
Ubunut 16.04Django 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是繼承AbstractBaseUser 與 PermissionsMixin這兩個原生的物件,然而在Django預設會去用原生的使用者架構來建立database並且原生的使用者架構也是繼承AbstractBaseUser 與 PermissionsMixin,這邊就出現兩邊再做有關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
留言
張貼留言