Djangoラーニングノート-カスタムUserモデル
最近卒业の设计をして、djangoとdjango rest frameworkを使う必要があって、しかし前にdjangoの関连するプロジェクトを书いたことがなくて、ただ见て、今本当にコードを书いて各种の问题に来ます.
私が必要とするUserモデルはdjangoが持参したUserとは異なるので、自分のUser Modelを定義する必要があります.ここでは、django 1.5+に適用する方法を記録します.
MyUserManagerとMyUserの定義
myappの下のmodelsを変更します.pyファイル:
ここでMyUserManagerとdjangoのUserManagerは大同小異で、直接UserManagerを継承してから変更することもできます.create_user関数でいいです.
MyUserクラスはカスタマイズされたUserモデルであり、必要に応じて様々な属性を追加することができます.
修正するpy
修正するpyファイル、認証に使用するmodelを次のように設定します.
データベースの更新
まず、前のデータベースを削除し、再構築し、次のコマンドを実行して新しいデータテーブルを生成します.
この3つのステップを経て、デフォルトのUserモデルは、私たちが定義したUserモデルに置き換えられました.もちろん、独自の認証モデルや権限システムを定義し、関連部分に触れてメモを追加することもできます.
私が必要とするUserモデルはdjangoが持参したUserとは異なるので、自分のUser Modelを定義する必要があります.ここでは、django 1.5+に適用する方法を記録します.
MyUserManagerとMyUserの定義
myappの下のmodelsを変更します.pyファイル:
from django.db import models
from django.contrib.auth.models import (
BaseUserManager, AbstractBaseUser, PermissionsMixin)
class MyUserManager(BaseUserManager):
def _create_user(self, username, email, password, **extra_fields):
"""
Creates and saves a User with the given username, email and password.
"""
if not username:
raise ValueError('The given username must be set')
email = self.normalize_email(email)
user = self.model(username=username, email=email, **extra_fields)
user.set_password(password)
user.save(using=self._db)
return user
def create_user(self, username, email, password, **extra_fields):
extra_fields.setdefault('is_staff', False)
return self._create_user(username, email, password, **extra_fields)
def create_superuser(self, username, email, password, **extra_fields):
extra_fields.setdefault('is_staff', True)
if extra_fields.get('is_staff') is not True:
raise ValueError('Superuser must have is_staff=True')
return self._create_user(username, email, password, **extra_fields)
class MyUser(AbstractBaseUser, PermissionsMixin):
username = models.CharField(max_length=254, unique=True, db_index=True)
email = models.EmailField('email address', max_length=254)
is_staff = models.BooleanField('staff status', default=False)
is_active = models.BooleanField('active', default=True)
USERNAME_FIELD = 'username'
REQUIRED_FIELDS = ['email']
objects = MyUserManager()
class Meta:
db_table = 'myuser'
def get_full_name(self):
return self.username
def get_short_name(self):
return self.username
ここでMyUserManagerとdjangoのUserManagerは大同小異で、直接UserManagerを継承してから変更することもできます.create_user関数でいいです.
MyUserクラスはカスタマイズされたUserモデルであり、必要に応じて様々な属性を追加することができます.
修正するpy
修正するpyファイル、認証に使用するmodelを次のように設定します.
AUTH_USER_MODEL = 'myapp.MyUser'
データベースの更新
まず、前のデータベースを削除し、再構築し、次のコマンドを実行して新しいデータテーブルを生成します.
$ python manage.py makemigrations myapp
$ python manage.py migrate
この3つのステップを経て、デフォルトのUserモデルは、私たちが定義したUserモデルに置き換えられました.もちろん、独自の認証モデルや権限システムを定義し、関連部分に触れてメモを追加することもできます.