Django提供了全套认证系统,本项目虽然使用JWT认证,但也是继承于Django认证模型。
我们本节要解决的问题是:Django提供了用户模型,但不完善,我们需要的一些字段没有,我们需要增加字段。Django框架不推荐自己建用户表,因为如果自建用户表,所有的认证系统将不能使用。
主要需求有两点:
第一点:要能够继承Django用户模型,并增加字段
第二点:所有模型,都需要增加创建日期和更新日期两个字段。
解决办法如下:
1 创建抽象模型
创建抽象模型,包括创建时间和更新时间两个字段,工程中所有的模型都可以继承这个抽象模型,会自动增加这两个字段。
在GeneralTools目录下,创建一个BaseModel.py文件,内容如下:
from django.db import models class BaseModel(models.Model): create_time = models.DateTimeField(auto_now_add=True, verbose_name='创建时间', help_text='创建时间') update_time = models.DateTimeField(auto_now=True, verbose_name='更新时间', help_text='更新时间') class Meta: # 说明这个类是一个抽象模型类,在迁移的时候不会生成表 abstract = True
2 创建用户模型
创建一个用户模型,不但继承Django用户模型,而且继承抽象模型。
在Applications/Organizations/models.py中,增加一个模型。
from django.db import models from django.contrib.auth.models import AbstractUser from GeneralTools.BaseModel import BaseModel class UserInfo(AbstractUser, BaseModel): openid = models.CharField(max_length=30, unique=True, verbose_name='微信openID', help_text='微信openID') mobile = models.CharField(max_length=11, unique=True, verbose_name='手机号', help_text='手机号') # 默认的username是有唯一约束的,暂存入手机号。另增一个name字段存放姓名(微信昵称) name = models.CharField(max_length=30, null=True, blank=True, verbose_name='姓名', help_text='姓名') photo_url = models.ImageField(upload_to='user', null=True, blank=True, verbose_name='头像', help_text='头像') def __str__(self): return self.name class Meta: db_table = 'UserInfo' verbose_name_plural = '001 用户信息表'
3 指定用户认证模型
在settings.py中增加AUTH_USER_MODEL参数,用于指定用户认证模型。
特别注意的是:用户认证模型的格式必须是:App名.模型名,APP名前不能加路径。而且,APP下的apps.py中的路径要正确。否则执行数据迁移要出错!
AUTH_USER_MODEL = 'Organizations.UserInfo'
4 执行数据迁移
在PyCharm Terminal下执行:
python manage.py makemigrations python manage.py migrate
5 数据库中查看表结构
可以看到,我们新增加的字段,都增加好了。