def -- 反序列化字段校验通过的新增数据和修改数据

一.新增数据的create方法

1.serializers.py代码示例

from rest_framework import serializers
from student import models
class StudentSerializer(serializers.Serializer):
    name = serializers.CharField(max_length=8,required=True)
    age = serializers.IntegerField(max_value=120,required=True)
    sex = serializers.IntegerField(default=1)

    def validate_name(self,attr):
        if attr == "老王":
            raise serializers.ValidationError('隔壁老王不能进')
        return attr

    def validate(self, attrs):
        if attrs.get('name') == "张三" and attrs.get('age') == 26:
            raise serializers.ValidationError('26岁的张三不能进')
        return attrs

    def create(self, validated_data):
        stu_data = models.Student.objects.create(**validated_data)
        return stu_data

2.views.py代码示例:

from django.views import View
from django.http import HttpResponse
from unsers.serializers import StudentSerializer
from student import models
import json
# Create your views here.
class StudentView(View):

    def post(self,request):
        data = json.loads(request.body)
        #将序列化的数据传入定义的反序列化类中,用data参数接收
        serializers = StudentSerializer(data=data)
        serializers.is_valid(raise_exception=True) #raise_exception=True该参数可以在校验失败时,直接报错
        serializers.save() #在校验通过时,会直接执行StudentSerializer类中的create方法
        return HttpResponse('ok')

2.修改数据的update方法:

serializers.py代码示例:

from rest_framework import serializers
from student import models
class StudentSerializer(serializers.Serializer):
    name = serializers.CharField(max_length=8,required=True)
    age = serializers.IntegerField(max_value=120,required=True)
    sex = serializers.IntegerField(default=1)

    def validate_name(self,attr):
        if attr == "老王":
            raise serializers.ValidationError('隔壁老王不能进')
        return attr

    def validate(self, attrs):
        if attrs.get('name') == "张三" and attrs.get('age') == 26:
            raise serializers.ValidationError('26岁的张三不能进')
        return attrs

    def create(self, validated_data):
        stu_data = models.Student.objects.create(**validated_data)
        return stu_data

    def update(self, instance, validated_data):
        #利用反射,将获取的数据,进行更新
        for key, value in validated_data.items():
            setattr(instance, key, value)
        #或者每个字段单独的更新
        # instance.name = validated_data.get('name')
        # instance.age = validated_data.get('age')
        # instance.sex = validated_data.get('sex')
        instance.save()
        #保存后,将对象返回
        return instance

views.py代码示例:

from django.views import View
from django.http import HttpResponse
from unsers.serializers import StudentSerializer
from student import models
import json
# Create your views here.
class StudentView(View):

    def post(self,request):
        data = json.loads(request.body)
        #将序列化的数据传入定义的反序列化类中,用data参数接收
        serializers = StudentSerializer(data=data)
        serializers.is_valid(raise_exception=True) #raise_exception=True该参数可以在校验失败时,直接报错
        serializers.save() #在校验通过时,会直接执行StudentSerializer类中的create方法
        return HttpResponse('ok')

    def put(self,request):
        data = json.loads(request.body)
        id = data.get('id')
        stu_obj = models.Student.objects.get(id=id)
        serializers=StudentSerializer(instance=stu_obj,data=data)
        serializers.is_valid(raise_exception=True)
        serializers.save() #在校验通过时,会直接执行StudentSerializer类中的update方法
        return HttpResponse('ok')

如果序列化类嵌套,且表关系比较复杂时,序列化的嵌套类,也需要改动

serializers.py的代码示例

from rest_framework import serializers
from student import models

class RolesSerializer(serializers.ModelSerializer):
    '''角色表序列化类'''
    class Meta:
        model = models.Role
        fields = ['id','name']
        extra_kwargs={
            "id":{"read_only":False}, # 在提交数据时,因为添加或更新,需要该字段,所以需要传入该字段的ID
            "name":{"read_only":True} # 在提交数据时,因为添加或更新,不需要该字段
        }

class DepartSerializer(serializers.ModelSerializer):
    '''部门表序列化类'''
    class Meta:
        model = models.Depart
        fields = ["id","title"]
        extra_kwargs = {
            "id": {"read_only": False},  # 在提交数据时,因为添加或更新,需要该字段,所以需要传入该字段的ID
            "title": {"read_only": True}  # 在提交数据时,因为添加或更新,不需要该字段
        }

class UserSerializer(serializers.ModelSerializer):
    '''用户表序列化类'''
    sex_text = serializers.CharField(source="get_sex_display")

    #通过实例化两个写好的序列化类,将字段加入到fields列表中,就可以获取该类中定义的所有字段
    depart = DepartSerializer()
    roles = RolesSerializer(many=True) # 对于多对多的表关系,一定要加上many=True

    class Meta:
        model = models.UserInfo
        fields = ["username","password",'email',"sex_text","roles","depart"]


    def create(self, validated_data):
       '''
       如果添加数据,在保存的时候,会执行该方法
       所以添加数据的逻辑,都应该写在这个方法中
       :param validated_data: 该参数中包含用户所提交的所有数据,数据为字典类型
       :return:
       '''
       pass

    def update(self, instance, validated_data):
        '''
        如果更新数据,在保存的时候,会执行该方法
       所以更新某一条数据的逻辑,都应该写在这个方法中
        :param instance: 被更新的数据对象
        :param validated_data: 该参数中包含用户所提交的所有数据,数据为字典类型
        :return:
        '''
        pass
posted @   志强爱璇璇  阅读(85)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示