后端重写update,create 方法示例 基于用户视图集修改增加用户 &反序列化入库修改字段入库信息

本文详细介绍了如何在Django REST框架中重写用户视图集的`update`和`create`方法,确保密码的安全存储和正确处理外键字段。在`update`方法中,无论是视图还是序列化器,都涉及了密码的加密处理。而在`create`方法中,展示了如何通过视图和序列化器创建新用户。此外,还提到了反序列化入库时外键字段自动添加_id的处理方式。
摘要由CSDN通过智能技术生成


1 基于用户视图集
修改用户 涉及到用户密码的修改 反序列化入库时需要密文保存
增加用户 涉及到用户密码的加密存储
2 反序列化入库修改字段入库信息 需要字段对应 外键在数据库中自动添加后缀_id


一、用户视图集 重写update方法

1 视图里重写

方案一 在视图里重写update方法逻辑
user.set_password(request.data.get(‘password’))

# 用户管理视图集
class UserInfoViewSet(ModelViewSet):
    queryset = User.objects.all()
    serializer_class = User_Serializer
    lookup_field = 'pk'
    lookup_url_kwarg = 'pk'

    # 修改用户信息  重写update方法  
    def update(self, request, *args, **kwargs):
        try:
            user = self.get_object()
            user.username = request.data.get('username')
            user.set_password(request.data.get('password'))
            user.phone = request.data.get('phone')
            user.email = request.data.get('email')
            user.save()
        except:
            return Response({'code': 500, 'msg': '修改用户报错'})

        return Response({'code': 200, 'msg': '修改用户成功'})

2 序列化器里重写

方案二 借助序列化器 在序列化器重写update方法
instance.set_password(validated_data.get(‘password’))

# 用户序列化器
class User_Serializer(ModelSerializer):
    password = serializers.CharField(write_only=True, trim_whitespace=True, max_length=50, min_length=2)
    class Meta:
        model = User
        fields = ['id', 'username', 'last_login', 'password', 'phone', 'date_joined', 'email']   #序列化字段
        read_only_fields = ['id', 'date_joined']  # 只读,不需要输入

    # 修改用户信息  重写update方法
    def update(self, instance, validated_data):
        instance.username = validated_data.get('username')
        instance.set_password(validated_data.get('password'))
        instance.phone = validated_data.get('phone')
        instance.email = validated_data.get('email')
        instance.save()
        return instance

二、用户视图集 重写create方法

1 视图里重写

方案一 在视图里重写create方法逻辑
User.objects.create_user(**request.data)

# 用户管理视图集
class UserInfoViewSet(ModelViewSet):
    queryset = User.objects.all()
    serializer_class = User_Serializer
    lookup_field = 'pk'
    lookup_url_kwarg = 'pk'

    # 添加用户信息   重写create方法  方案一 在视图逻辑自己写
    def create(self, request, *args, **kwargs):
        try:
            User.objects.create_user(**request.data)
        except:
            return Response({'code': 500, 'msg': '创建用户报错'})

        return Response({'code': 200, 'msg': '添加用户成功'})

2 序列化器里重写

方案二 借助序列化器 在序列化器重写create方法
User.objects.create_user(**validated_data)

# 用户序列化器
class User_Serializer(ModelSerializer):
    password = serializers.CharField(write_only=True, trim_whitespace=True, max_length=50, min_length=2)
    class Meta:
        model = User
        fields = ['id', 'username', 'last_login', 'password', 'phone', 'date_joined', 'email']
        read_only_fields = ['id', 'date_joined']  # 只读,不需要输入

    # 添加用户信息   重写create方法
    def create(self, validated_data):
        user = User.objects.create_user(**validated_data)
        return user

三 反序列化入库修改字段入库信

需要字段一一对应 外键在数据库中自动添加后缀_id
请添加图片描述
注意: 如果无法判断从前端获取的数据和类型,可以print()打印一下, type()判断类型
print(‘获取的数据spu>>>>>>’, spu,‘spu的数据类型>>>>>>’, type(spu), ‘<<<<<’, spu.desc_detail)

# spu视图集
class SPUViewSet(ModelViewSet):
    queryset = SPU.objects.all()
    serializer_class = SPU_Serializer
    def update(self, request, *args, **kwargs):
        spu = self.get_object()
        # print('xxxxxxx>>>>>>', spu, type(spu), '<<<<<', spu.desc_detail)
        name = request.data.get('name')
        spu.name = name+'_luoting修改'
        spu.brand_id = request.data.get('brand')
        spu.category1_id = request.data.get('category1')
        spu.category2_id = request.data.get('category2')
        spu.category3_id = request.data.get('category3')
        spu.desc_detail = request.data.get('desc_detail')
        spu.desc_pack = request.data.get('desc_pack')
        spu.desc_service = request.data.get('desc_service')
        spu.brand_name = request.data.get('brand_name')
        spu.save()
        return Response({'status': 200, 'message': 'SPU修改成功'})

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值
>