DjangoRestFramework【用户的创建、查询、修改、删除】

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请求

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值