dorian

导航

 

  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 数据库中查看表结构

  可以看到,我们新增加的字段,都增加好了。

 

posted on 2020-03-04 17:40  dorian  阅读(189)  评论(0编辑  收藏  举报