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进行访问测试了

 

 

 

 

posted @ 2020-07-15 21:01  学海无涯苦中作乐  阅读(148)  评论(0编辑  收藏  举报