drf_作业1
# 作业
1 自定义User表,新增mobile唯一约束字段;新增icon图片字段
2 在自定义User表基础上,用 GenericViewSet + CreateModelMixin + serializer 完成User表新增接口(就是注册接口)(重要提示:序列化类要重写create方法,不然密码就是明文了)
3 在自定义User表基础上,用 GenericViewSet + RetrieveModelMixin + serializer 完成User表单查(就是用户中心)
4 在自定义User表基础上,用 GenericViewSet + UpdateModelMixin + serializer 完成用户头像的修改
首先书写 model.py文件
from django.db import models # Create your models here. from django.contrib.auth.models import AbstractUser class User(AbstractUser): mobile = models.CharField(max_length=32, unique=True) icon = models.ImageField(upload_to="icon/", default='/icon/default.png') # 图片格式的字段 上传位置 icon, 默认不上传的就使用这个图片 class Meta: verbose_name = '用户表' verbose_name_plural = verbose_name
使用命令进行数据迁移
数据迁移成功后,后续就能够使用了
再根据要求书写不同的序列化器,后面进行不同方式进行调用即可
自己创建的serializer.py(名字自己随便取的,这个是序列化的英文一般我取这个名字,你取什么名字,后面就怎么导入文件进行使用)
# 序列化器 from rest_framework import serializers from .models import User from rest_framework.exceptions import ValidationError from api import models class UserModelSerializer(serializers.ModelSerializer): re_password = serializers.CharField(max_length=16, min_length=4, write_only=True, required=True) # 这里的验证密码只需要序列化,就是写进来的时候需要,返回的时候不需要,也不需要往数据库里面存储 class Meta: model = User fields = ['username', 'password', 're_password', 'mobile', 'icon'] extra_kwargs = { 'password': {'write_only': True} } def validate_mobile(self, attrs): if len(attrs) < 11: raise ValidationError('手机号码输入的不合法!') return attrs def validate(self, attrs): if not attrs.get('password') == attrs.get('re_password'): raise ValidationError('两次密码输入不一致!') attrs.pop('re_password') return attrs def create(self, validated_data): user = models.User.objects.create_user(**validated_data) return user class ReadonlyModelSerializer(serializers.ModelSerializer): class Meta: model = models.User fields = ['username', 'icon'] class ImageModelSerializer(serializers.ModelSerializer): class Meta: model = models.User fields = ['icon']
再来是写视图文件views.py
from django.shortcuts import render # Create your views here. from api import models from .serializer import UserModelSerializer from rest_framework.viewsets import GenericViewSet from rest_framework.mixins import RetrieveModelMixin, UpdateModelMixin, CreateModelMixin from api import serializer class RegisterView(GenericViewSet, CreateModelMixin, UpdateModelMixin, RetrieveModelMixin): queryset = models.User.objects.all() serializer_class = UserModelSerializer def get_serializer_class(self): # 重写这个方法,根据不同的请求方法对应的action来进行判断 ,返回不同的序列化器 if self.action == 'create': return serializer.UserModelSerializer elif self.action == 'retrieve': return serializer.ReadonlyModelSerializer elif self.action == 'update': return serializer.ImageModelSerializer
再来是写视图对应的路由urls.py (这里是书写项目的主路由对应的文件,我暂时写在主路由上的,没分发)
from django.contrib import admin
from django.urls import path, re_path, include
from api import views
from rest_framework.routers import SimpleRouter # 导入相关路由
router = SimpleRouter() # 进行实例化
router.register('register1', views.RegisterView, 'register1') # 注册 (访问的url名称,对应视图,反解析的名称(前端用的多点,不用的话可以不写))
urlpatterns = [
path('admin/', admin.site.urls),
]
urlpatterns += router.urls # 把注册好的内容加到urlpatterns中
注意新的app生成要需要注册,新的框架也需要注册,如下图:
然后重启一下项目,就可以通过网页或者postman进行访问测试了