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