最近做畢業設計,需要用到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模型,我們可以根據需要添加各種屬性。
修改settings.py
修改settings.py文件,添加如下內容設置認證使用的model:
AUTH_USER_MODEL = 'myapp.MyUser'
更新數據庫
首先刪掉之前的數據庫,然後重新建立,運行如下命令生成新的數據表:
$ python manage.py makemigrations myapp
$ python manage.py migrate
經過這三步,默認的User模型已經被替換成了我們自己定義的User模型了。當然我們也可以定義自己的認證模型以及權限系統,後面涉及到相關部分再添加筆記了。