在同一个视图类当中使用多个序列化器 get_serializer_class 的使用

  1 # 1.项目分布
  2 drf_0
  3 --app01
  4 ----__init__.py
  5 ----view.py
  6 ----models.py
  7 ----serlizer.py
  8 ----urls.py
  9 --drf_0
 10 ----__init__.py
 11 ----urls.py
 12 ----setting.py
 13 --media
 14 ----icon
 15 
 16 # 2.项目描述:1. 使用diango--auth表,新增自定义表名-- telephone icon 
 17         2. setting中进行相关的配置 
 18         3. 在同一个视图类使用多个序列化器 重写方法--get_serializer_class
 19         4. 注册--重写序列化--create view--create  单查 修改接口
 20         
 21 # models.py 
 22 from django.db import models
 23 from django.contrib.auth.models import AbstractUser
 24 
 25 class User(AbstractUser):
 26     telephone = models.CharField(max_length=11)
 27     icon = models.ImageField(upload_to='icon', default='icon/default.png')
 28 
 29 # setting.py
 30 # 头像文件夹配置
 31 MEDIA_URL = '/media/'
 32 MEDIA_ROOT = os.path.join(BASE_DIR, 'media')  # 现在的BASEDIR是项目根路径
 33 # auth表配置
 34 AUTH_USER_MODEL = 'app01.user'  # app.小写表名
 35 
 36 # app01--urls.py
 37 from django.urls import path, include
 38 from rest_framework.routers import SimpleRouter
 39 
 40 from app01 import views
 41 
 42 router = SimpleRouter()
 43 router.register('register', views.RegisterView, 'register')
 44 
 45 urlpatterns = [
 46     path('', include(router.urls)),
 47 ]
 48 # def_0--urls.py
 49 from django.contrib import admin
 50 from django.urls import path, include, re_path
 51 from django.views.static import serve
 52 from django.conf import settings
 53 
 54 urlpatterns = [
 55     path('admin/', admin.site.urls),
 56     re_path('media/(?P<path>.*)', serve, {'document_root': settings.MEDIA_ROOT}),
 57 
 58     path('app01/', include('app01.urls'))
 59 ]
 60 
 61 view.py
 62 from django.shortcuts import render
 63 from . import models
 64 from rest_framework.viewsets import GenericViewSet
 65 from rest_framework.mixins import CreateModelMixin, RetrieveModelMixin, UpdateModelMixin
 66 from rest_framework.response import Response
 67 from . import serializer
 68 
 69 dic = {
 70     'username': None,
 71     'msg': '',
 72     'telephone': None
 73 
 74 }
 75 
 76 
 77 class RegisterView(GenericViewSet, CreateModelMixin, RetrieveModelMixin, UpdateModelMixin):
 78     queryset = models.User.objects.all()
 79     serializer_class = serializer.RegisterSerializer
 80 
 81     def get_serializer_class(self):
 82         if self.action == 'create':
 83             return serializer.RegisterSerializer
 84         elif self.action == 'retrieve':
 85             return serializer.RetrieveSerializer
 86         elif self.action == 'update':
 87             return serializer.UpdateSerializer
 88 
 89     def create(self, request, *args, **kwargs):
 90         response = super(RegisterView, self).create(request, *args, **kwargs)
 91         username = response.data.get('username')
 92         telephone = response.data.get('telephone')
 93         dic['username'] = username
 94         dic['telephone'] = telephone
 95         dic['msg'] = '成功'
 96         return Response(data=dic)
 97 serializer.py
 98 from rest_framework import serializers
 99 from rest_framework.exceptions import ValidationError
100 
101 from . import models
102 import re
103 
104 # 注册
105 class RegisterSerializer(serializers.ModelSerializer):
106     re_password = serializers.CharField(write_only=True, max_length=11, min_length=6)
107 
108     class Meta:
109         model = models.User
110         fields = ['username', 'password', 're_password', 'telephone', 'icon']
111         extra_kwargs = {
112             'username': {'max_length': 32},
113             'password': {'max_length': 32, 'write_only': True},
114             'icon': {'read_only': True}
115         }
116 
117     def validate_telephone(self, data):
118         if re.match('^1[3-9][0-9]{9}', data):
119             return data
120         raise ValidationError('手机号不合法')
121 
122     def validate(self, attrs):
123         if attrs.get('password') == attrs.get('re_password'):
124             attrs.pop('re_password')
125             return attrs
126         raise ValidationError('两次输入密码不一致')
127 
128    # 不重写的话 密码会以明文进入数据库 登录的时候出现登不上的问题
129     def create(self, validated_data):
130         user = models.User.objects.create_user(**validated_data)
131         return user
132 
133 # 单查
134 class RetrieveSerializer(serializers.ModelSerializer):
135     class Meta:
136         model = models.User
137         fields = ['username', 'icon']
138 
139 # 更新
140 class UpdateSerializer(serializers.ModelSerializer):
141     class Meta:
142         model = models.User
143         fields = ['icon']
144  
145 
146 
147 
148   

 

posted @ 2021-05-18 22:42  mofr  阅读(439)  评论(0)    收藏  举报