[ 基于django自带的用户模型添加自定义内容 ]


一. 重写用户模型类models.py

  • blank=True 必填字段下设置成非必填字段
  • default= 设置默认值
  • choices= 枚举,设置前端的选填按钮
  • models.ForeignKey 外键字段,关联另一个表
  • to=关联的表, to_field=关联表的唯一字段, on_delete=models.SET_NULL 如果关联的表进行删除操作,SET则是改为空NULL
  • db_constraint=False 关闭外键数据库功能,保留查询功能
  • related_name='collects_to_articles' 提供重新定义反向查询的名字
    • 查询演示: collect = articles.collects_to_articles.all().first()
  • notebook = user.notebook_set.all().first() 反向查询如果不重新定义查询的名字,默认查询的类名(小写)拼接(_set)
    • 查询演示:
      • articles = Articles.objects.filter(title='django').first() 反向查询关联列表
      • collect = articles.collects_to_articles.all().first()

from django.contrib.auth.models import AbstractUser # 用户类导包 《一定要继承这个用户类》

from django.db import models
from django.contrib.auth.models import AbstractUser # 用户类导包
# from article.models import Articles

# 用户头像关联类/外键
class Avatar(models.Model):
    id = models.AutoField(primary_key=True)
    url = models.ImageField(verbose_name='图片路径', upload_to='avatar/')

    class Meta:
        db_table = 'tb_avatar'
        verbose_name = '用户头像'
        verbose_name_plural = verbose_name


# 用户表
class UserInfoModels(AbstractUser):
    id = models.AutoField(primary_key=True)
    nike_name = models.CharField(max_length=16, verbose_name='昵称', default='')
    account_status = models.SmallIntegerField(verbose_name='账号状态', default=0, choices=(
        (0, '正常'), (1, '异常'), (2, '封禁')
    ))
    sign_status = models.SmallIntegerField(verbose_name='注册方式', default=0, choices=(
        (0, '用户名注册'), (1, '手机号注册'), (2, '邮箱注册'), (3, 'QQ注册')
    ))
    tel = models.IntegerField(verbose_name='手机号', default=0, blank=True)
    token = models.CharField(verbose_name='token',
                             max_length=64, default='', blank=True)
    unique_id = models.CharField(
        verbose_name='平台唯一ID', max_length=64, default='')
    avatar = models.ForeignKey(
        to=Avatar, to_field='id', on_delete=models.SET_NULL, blank=True, null=True, verbose_name='用户头像', db_constraint=False
    )
    collects = models.ManyToManyField(
        to='article.Articles', verbose_name='收藏的文章', related_name='collects_to_articles', db_constraint=False, blank=True
    )

    # 继承模型类内嵌套类
    class Meta:
        db_table = 'tb_user'  # 表名称
        verbose_name = '用户列表'  # 后台显示对应名称
        verbose_name_plural = verbose_name  # plural复数显示,中文无区别

    # 后台显示数据,魔法方法,运行print打印方法的时候触发
    def __str__(self) -> str:
        return self.username

二. 配置settings.py 定义新的用户表

AUTH_USER_MODEL = 'user.UserInfoModels'