【Django项目开发】用户注册模型类、序列化器类、视图类设计(三)

news2024/11/19 15:17:04

在这里插入图片描述


文章目录

  • 一、模型类设计
    • 1、Django认证系统提供了用户模型类User,为什么还要定义User模型类?
    • 2、AbstractUser
    • 3、自定义用户模型类的字段有
    • 4、User模型类编写好了就可以了吗?
  • 二、序列化器类设计
    • 1、注意
    • 2、单字段进行校验
    • 3、用户认证的时候为什么不用create,而用create_user呢?
  • 三、视图类设计
    • 1.注意
    • 2.APIView子类
  • 四.路由配置
    • 1.特别注意:

一、模型类设计

1、Django认证系统提供了用户模型类User,为什么还要定义User模型类?

Django认证系统提供了用户模型类User,具体位置:django.contrib.auth.models.User;
因为Django认证系统提供的用户模型类User中缺少我本次项目中需要的字段,需要重写定义User模型类,最好不要和User重名,我以UserModel命令

2、AbstractUser

自定义的UserModel需要继承AbstractUser(User也继承了AbstractUser),同时还需要继承BaseModel

AbstractUser源码如下:

class AbstractUser(AbstractBaseUser, PermissionsMixin):
    username_validator = UnicodeUsernameValidator()
    .....

class User(AbstractUser):
    class Meta(AbstractUser.Meta):
        swappable = 'AUTH_USER_MODEL'

3、自定义用户模型类的字段有

phone:手机号
real_name:真实名字
roles:用户的角色
dept:所在部门

代码如下:

# ERP系统的用户模型类,默认采用django自带的User类
class UserModel(AbstractUser, BaseModel):
    phone = models.CharField(help_text='手机号码',
                             verbose_name='手机号码',
                             max_length=11,
                             unique=True,
                             blank=True,
                             null=True)
    real_name = models.CharField(help_text='真实名字',
                                 verbose_name='真实名字',
                                 max_length=64,
                                 blank=True,
                                 null=True)
    # 用户所有的角色
    roles = models.ManyToManyField('RolesModel', db_table='t_users_roles', blank=True)
    dept=models.ForeignKey('DeptModel',blank=True,null=True,on_delete=models.SET_NULL,verbose_name='用户所在部门')  #当部门删除后,员工的外键设置为null

    class Meta:
        db_table = 't_user'
        verbose_name = '系统用户表'
        verbose_name_plural = verbose_name

    def __str__(self):
        # return self.username+":"+self.real_name
        return self.username

4、User模型类编写好了就可以了吗?

当然不是了,Django不会识别到你自己定义的User模型类,此时Django还是识别系统自带的User模型类,那需要怎么做
需要在settings.py配置文件中配置

特别注意:添加自定义用户模型类(应用名字.模型类名)

AUTH_USER_MODEL='erp_system.UserModel'

二、序列化器类设计

1、注意

1、extra_kwargs:当对模型类中定义的字段进行细微的调整时,在序列化器类中使用extra_kwargs进行调整
2、模型类中字段如果有设置为unique=True时,当校验不通过,在序列化输出时,并不是我想要的校验结果,可以通过
“validators”: [UniqueValidator(queryset=UserModel.objects.all(), message=‘用户名已注册,请重新输入’)],进行自定义.

3、一定要记住password字段,一定不能输出,要设置为’write_only’: True,

2、单字段进行校验

当在extra_kwargs={}中没法进行细微的调整时,需要进行单字段校验
采用validate_属性名称
例如当对手机号进行校验时,

用validate_phone(attr)

必须返回attr
拓展:

多字段校验:validate(attrs)

3、用户认证的时候为什么不用create,而用create_user呢?

UserModel.objects.create(**validated_data):
create:只会将反序列化输入校验通过的字段,原样插入到数据库中,因为密码是不能直接插入到数据中的
所以必须要重写create方法.

代码如下:

    def create(self,validated_data):
        '''必须重写create函数,因为用户密码是不能直接插入到数据库的'''
        user=UserModel.objects.create_user(**validated_data)
        return user
from rest_framework.serializers import ModelSerializer
from erp_system.models import UserModel
from rest_framework.exceptions import ValidationError
import re
from rest_framework import serializers
from rest_framework.validators import UniqueValidator

class UserRegisterSerializer(ModelSerializer):
    """
    用户注册的序列化器类
    作用:序列化、反序列化、对字段进行严格验证
    """
    class Meta:
        model = UserModel
        fields = ['id', 'username', 'password', 'phone', 'real_name','token']
        extra_kwargs = {
            'password': {
                'write_only': True,
                'max_length': 18,
                'min_length': 4,
                'help_text': '密码',
                'label': '密码',
                'error_messages': {
                    'min_length': "允许输入4-18个字符",
                    'max_length': "允许输入4-18个字符"
                },
            },
            'username': {
                'write_only': True,
                'help_text': '用户名',
                'label': '用户名',
                'max_length': 18,
                'min_length': 2,
                'error_messages': {
                    'min_length': "允许输入2-18个字符",
                    'max_length': "允许输入2-18个字符"
                },
                "validators": [UniqueValidator(queryset=UserModel.objects.all(), message='用户名已注册,请重新输入')]
            },
            'real_name': {
                'help_text': '真实姓名',
                'label': '真实姓名',
                'max_length': 64,
                'min_length': 2,
                'error_messages': {
                    'min_length': "允许输入2-64个字符",
                    'max_length': "允许输入2-64个字符"
                }
            }
        }

    def validate_phone(self, attr):
        print()
        # 验证手机号,验证规则(validate_属性名称)
        if not attr:
            return attr
        else:
            if not re.match(r'^1[3589]\d{9}$', attr):
                raise ValidationError('请输入正确的手机号码')

        return attr

    def create(self,validated_data):
        '''必须重写create函数,因为用户密码是不能直接插入到数据库的'''
        user=UserModel.objects.create_user(**validated_data)
        return user

三、视图类设计

1.注意

当视图类中需要用的接口包括增删改查查时,不用想直接继承ModelViewSet即可
当视图类中只实现某1个功能,只需要继承特定的视图类即可,不能继承ModelViewSet.
因为会有漏洞,不法分子会恶意访问接口进行修改数据.

2.APIView子类

ListAPIView
CreateAPIView
UpdateAPIView
RetrieveAPIView
DestroyAPIView
ListCreateAPIView
RetrieveUpdateAPIView
RetrieveDestroyAPIView
RetrieveUpdateDestroyAPIView

from rest_framework.generics import CreateAPIView
from erp_system.models import UserModel
from erp_system.serializer.user_serializer import UserRegisterSerializer

class RegisterView(CreateAPIView):
    """
    create:
    注册用户

    参数:username,password 必须传递;phone,real_name 可选参数,return:添加返回的user对象
    """
    queryset = UserModel.objects.all()
    serializer_class = UserRegisterSerializer

四.路由配置

urlpatterns = [
    # re_path(r'^user/login/$',obtain_jwt_token),    #以/结尾  JWT签发和认证token的视图类
    re_path(r'user/register/$',RegisterView.as_view()),      #用户注册路由
]

1.特别注意:

当数据库脚本生成和迁移操作时,如果数据库中没有生成对应的表,
首先需要检查模型类设计是否正确;
接着将迁移脚本都删除,同时将数据库中的表也删除
重新执行迁移脚本(init.py文件不要删)

在这里插入图片描述

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/112453.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++构造函数和析构函数

(一)构造函数 要点 定义:构造函数 ,是一种特殊的方法。主要用来在创建对象时初始化对象, 即为对象成员变量赋初始值,总与new运算符一起使用在创建对象的语句中。特别的一个类可以有多个构造函数 &#xff0…

网络协议知识串讲-第38讲-用双十一的故事串起碎片的网络协议(中)

上一节我们讲到,手机App经过了一个复杂的过程,终于拿到了电商网站的SLB的IP地址,是不是该下单了? 别忙,俗话说的好,买东西要货比三家。大部分客户在购物之前要看很多商品图片,比来比去,最后好不容易才下决心,点了下单按钮。下单按钮一按,就要开始建立连接。建立连接…

Spring Cache(边路缓存)

一、Spring Cache介绍 Spring Cache 是Spring - context-xxx.jar中提供的功能,可以结合EHCache,Redis等缓存工具使用。给用户提供非常方便的缓存处理,缓存基本判断等操作,可以直接使用注解实现。 ​ 在包含了Spring - context-xxx.jar的Spri…

07---vue前端实现增删改查

前端VUE通过请求后端实现增删改查&#xff0c;文末会有前端完整代码 1、实现查询功能 一、实现三个条件一起查询 后台需要实现这三个条件的模糊查询 UserController.java //分页查询GetMapping("/page")public IPage<User> findPage(RequestParam Integer p…

【Jenkins】学习笔记

学习笔记一、Jenkins1.1、Jenkins的作用二、下载安装2.1、安装环境2.2、安装GitLab2.3、安装Jenkins三、Jenkins Git Maven 部署配置3.1、安装maven插件3.2、新建项目3.3、自动发布到测试服务器四、publish over ssh 配置4.1、超时机制4.2、shell的日志输出4.3、运行前清理五…

网络地址转换NAT

目录 IP 地址空间即将面临耗尽的危险 NAT 缓解 IP 地址空间耗尽的问题 NAT 的基本方法 VPN 的要点 IP 地址空间即将面临耗尽的危险 互联网采用了无分类编址方式、动态分配IP地址等措施来减缓IP地址空间耗尽的速度 但由于互联网用户数目的激增&#xff0c;特别是大量小型办公…

Linux搭建DHCP服务

DHCP(Dynamic Host Confifuration Protocol,动态主机配置协议)它可以为客户自动分配IP地址、以及缺省网关、DNS服务器的IP地址等TCP/IP参数。 简单说,就是在DHCP服务器上有一个存放着IP地址、网关、DNS等参数。当客户端请求使用时,服务器则负责将相应的参数分配给客户端,…

win10环境下基于face_recognition搭建自己的人脸识别软件

在win10环境下安装face_recognition&#xff0c;了解face_recognition中api的使用&#xff0c;如人脸截取、人脸矫正、人脸特征提取、人脸关键点提取、人脸mask获取、人脸特征比对等功能。最后构建自己的人脸数据库&#xff0c;使用knn实现人脸识别软件。 1、安装face_recogni…

【圣诞特辑】码一个漂漂亮亮的圣诞树(Single Dog版)

目录 前言 一、C语言版圣诞树 1.代码实现 2.效果图 二、python版圣诞树 1.代码实现 2.效果图​ 三、html5版圣诞树 1.代码实现 2.效果图 总结 前言 圣诞节即将来临&#xff0c;圣诞树也是必不可少的装饰之一。圣诞树是一棵绿叶繁茂的树&#xff0c;上面挂满了彩色的灯…

Nginx学习笔记2【尚硅谷】

host文件修改时&#xff0c;可以更改用户组权限或者复制到某个有权限的位置修改完再复制替换之前的文件。 在server{}中&#xff0c;listenserver_name两个加一起是唯一的。 代理服务器就是一个网关。 配置Nginx反向代理&#xff1a; 注意&#xff1a;在写proxy_pass时&#xf…

java+selenium环境搭建

目录 1.写在前面的话: 2.下载谷歌驱动 3.添加Selenium依赖(我这里添加的是4.0.0版本的) 4.在操作过程中可能出现的问题&解决办法 目录 1.写在前面的话: 2.下载谷歌驱动 3.添加Selenium依赖(我这里添加的是4.0.0版本的) 1.写在前面的话: (1)java版本最低要求为8,Chro…

SpringBoot整合Activemq

目录 一、Pom.xml 二、Spring配置文件 三、队列 四、主题 一、Pom.xml <dependencies><!-- activemq核心依赖包 --><dependency><groupId>org.apache.activemq</groupId><artifactId>activemq-all</artifactId><version>…

终生学习——读书有什么坏处

一般爱读书者往往受到赞扬&#xff0c;但仍然需要谨记一些读书的原则 目录 一、读书的整体观点 二、为什么需要知道读书的坏处 三、何时会出现读书的坏处 四、读书有什么坏处 1、100%全部相信书中的观点&#xff0c;进而实践了错误观点 2、不实践 五、如何杜绝读书的害处…

程序员为了少加班想了这几招

&#x1f4e3;&#x1f4e3;&#x1f4e3;&#x1f4e3;&#x1f4e3;&#x1f4e3;&#x1f4e3; &#x1f38d;大家好&#xff0c;我是慕枫 &#x1f38d;前阿里巴巴高级工程师&#xff0c;InfoQ签约作者、阿里云专家博主&#xff0c;一直致力于用大白话讲解技术知识 &#x…

一个简单的Linux内核字符驱动程序编写

一、背景 为了了解设备驱动程序的框架&#xff0c;在此编写一个简单的字符驱动程序&#xff0c;以此来对驱动程序的框架进行一个简单的了解。 二、设备驱动程序 所谓设备驱动程序&#xff0c;其实就是计算机硬件与外部设备进行通信的接口。由于硬件设备各式各样&#xff0c;…

【Ctfer训练计划】——(四)

作者名&#xff1a;Demo不是emo 主页面链接&#xff1a;主页传送门创作初心&#xff1a;舞台再大&#xff0c;你不上台&#xff0c;永远是观众&#xff0c;没人会关心你努不努力&#xff0c;摔的痛不痛&#xff0c;他们只会看你最后站在什么位置&#xff0c;然后羡慕或鄙夷座右…

【kafka】学习笔记(三)

学习笔记七、Kafka-Eagle 监控7.1 环境准备7.2 Eagle 安装7.3、修改配置文件7.4、添加环境变量7.5、启动Eagle八、Kafka-Kraft 模式8.1、Kafka-Kraft 集群部署8.2、初始化集群数据目录8.3、启动 kafka 集群8.4、测试8.5、集群启动脚本九、SpringBoot集成Kafka七、Kafka-Eagle 监…

RabbitMQ 第一天 基础 4 RabbitMQ 的工作模式 4.3 Routing 路由模式

RabbitMQ 【黑马程序员RabbitMQ全套教程&#xff0c;rabbitmq消息中间件到实战】 文章目录RabbitMQ第一天 基础4 RabbitMQ 的工作模式4.3 Routing 路由模式4.3.1 模式说明4.3.2 代码编写4.3.3 小结第一天 基础 4 RabbitMQ 的工作模式 4.3 Routing 路由模式 4.3.1 模式说明 …

React 学习笔记总结(四)

文章目录1. 创建组件流程(以及脚手架环境流程)2. 样式 的模块化3. 常用快捷生成4. 通用性 组件编码流程5. React脚手架 配置代理5.1 React 引入 ajax库5.2 第一种配置代理方式(package.json)5.3 第二种代理方式(setupProxy.js)6. React List列表效果实现7. React 消息订阅与发布…

“内卷之王”vivo:成败即将见分晓

文丨熔财经 作者|XL 12月22日&#xff0c;随着年底收官之作S16系列正式发布&#xff0c;vivo完成了自己的年度答卷。2022年&#xff0c;vivo总体风头正盛&#xff0c;尤其在第三季度一马当先稳居国内出货量榜首&#xff0c;市占比提升到20.0%&#xff0c;领先第二名3%。这是一…