Djangoラーニングノート-カスタムUserモデル

4958 ワード

最近卒业の设计をして、djangoとdjango rest frameworkを使う必要があって、しかし前にdjangoの関连するプロジェクトを书いたことがなくて、ただ见て、今本当にコードを书いて各种の问题に来ます.
私が必要とする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モデルに置き換えられました.もちろん、独自の認証モデルや権限システムを定義し、関連部分に触れてメモを追加することもできます.