1.创建用户模型类
from django.contrib.auth.models import AbstractUser
from django.db import models
class User(AbstractUser):
mobile = models.CharField(max_length=15, unique=True, verbose_name="手机号码")
# avatar = models.ImageField(upload_to="avatar", null=True, blank=True, verbose_name="用户头像")
# wxchat = models.CharField(max_length=64, default=True, blank=True, verbose_name="微信号")
class Meta:
db_table = "drf_user"
verbose_name = "用户信息"
verbose_name_plural = verbose_name
这里创建会存在一些问题,看我的写另外一个教程:https://blog.csdn.net/qq_35653657/article/details/128832687
2.创建用户路由
总路由下
from user.views import UserViewSets
router=routers.DefaultRouter()
# 可以通过router默认路由注册资源
router.register('users',UserViewSets)
urlpatterns = [
....
# 配置RESTFulAPI
path('api/v1/',include(router.urls)),
...
]
3.user视图类
user.views
from rest_framework import status
from rest_framework.decorators import action
from rest_framework.mixins import RetrieveModelMixin, UpdateModelMixin, DestroyModelMixin
from rest_framework.response import Response
from rest_framework.viewsets import GenericViewSet
from user.models import User
from user.serializers import UserSerializer, UserRegistSerializer
class UserViewSets(GenericViewSet,RetrieveModelMixin,UpdateModelMixin,DestroyModelMixin):
"""
声明用户资源类 用户操作:获取个人信息 更新个人信息 删除账户
扩展出action路由 用户操作:创建账户
"""
queryset = User.objects.all()
serializer_class = UserSerializer
# 创建一个注册的方法类
@action(methods=["POST"],detail=False)
def regist(self,request):
serializer=UserRegistSerializer(data=request.data)
serializer.is_valid(raise_exception=True)
serializer.save()
return Response(serializer.data,status=status.HTTP_201_CREATED)
因为注册类比较特殊,他有一个验证密码功能,所以我就单独创建了一个注册方法类,使用的也是独立的序列化方法,获取个人信息
更新个人信息
删除账户
使用的都是serializers.ModelSerializer
序列化,注册使用的是serializers.Serializer
序列化方法.
4.user序列化类
user.serializers
from rest_framework import serializers
from user.models import User
class UserSerializer(serializers.ModelSerializer):
class Meta:
model = User
# fields = "__all__"
# 不让看到的字段
exclude=["user_permissions","groups"]
# 因为UpdateModelMixin方法修改密码的时候不会对数据进行加密,所以需要就需要我自己写一个方法对数据进行加密
def validate(self,attrs):
print("原生创建")
from django.contrib.auth import hashers
attrs["password"]=hashers.make_password(attrs["password"])
print("修改之后的字段")
return attrs
# 创建用户注册序列化类
class UserRegistSerializer(serializers.Serializer):
username = serializers.CharField(max_length=10, min_length=3, error_messages={
"required": "用户名必填"
})
# 写了write_only可以写入但是不展示
password = serializers.CharField(max_length=10, min_length=3, write_only=True)
password2 = serializers.CharField(max_length=10, min_length=3, write_only=True)
mobile = serializers.CharField(max_length=15)
def validate_password2(self, data):
if data != self.initial_data["password"]:
raise serializers.ValidationError("密码不一致111")
else:
return data
# 校验密码,写了validate_password2和write_only=True这个方法基本都不用写了
# def validate(self,attrs):
# # if attrs["password"]!=attrs["password2"]:
# # raise serializers.ValidationError("密码不一致")
# del attrs["password2"]
# return attrs
def create(self, validated_data):
print(validated_data)
# 使用User.objects.create密码不加密,使用User.objects.create_user密码加密
# user_obj=User.objects.create(**validated_data),这个方法是将全部写入数据库,但是password2是多余的,要想办法去掉
user_obj = User.objects.create_user(username=validated_data.get("username"),
password=validated_data.get("password"),
mobile=validated_data.get("mobile"))
return user_obj
UserSerializer
序列化方法在使用修改的时候,默认的UpdateModelMixin
是没有加密功能的,于是需要添加一个加密功能.
UserRegistSerializer
序列化添加了一个验证密码的功能,其中保存的时候使用的方法跟常规方法也不一样,需要注意这个地方的写法.
5.使用方法
1.注册
使用的是GenericViewSet
类加自定义方法,使用的是POST
请求
2.查询个人
使用的是RetrieveModelMixin
类,使用的是EGT
请求
3.修改
使用的是UpdateModelMixin
类,使用的是UPDATE
请求
4.注销
使用的DestroyModelMixin
类,使用的是DELETE
请求