• Django6—ModelSerializer 、create,update方法


    create:

    1、创建序列化器对象时,如果仅仅只传data参数
    2、序列化器对象调用save方法时,会调用序列化器类中的create方法,进行数据创建操作

    serializer = serializers.ProjectModelSerializer(data=python_data)
    
    serializer.save(user={'name': 'xx', 'age': 18}, score=100)
    
    return JsonResponse(serializer.data, json_dumps_params={"ensure_ascii": False})

    update:

    1、创建序列化器对象时,如果同时给data和instance传参数
    2、序列化器对象调用save方法时,会调用序列化器类中的update方法,进行数据更新操作

     serializer = serializers.ProjectSerilizer(instance=self.get_object(pk), data=python_data)
    
     return JsonResponse(serializer.data, json_dumps_params={"ensure_ascii": False}, status=201)

    ModelSerializer 

    1、可以继承ModelSerializer,根据模型类来自动生成序列化器类中的字段

    2、必须得指定model参数(模型类),用于指定使用的模型

    3、会实现create、update方法

    4、会给主键字段、DataTimeField(指定auto_now_add和auto_now参数),会添加read_only=True

    5、会给有指定default参数的字段,添加required=False

    6、会给有指定null参数的字段,添加allow_null=True

    7、会给有指定blank参数的字段,添加allow_blank=True

    class ProjectModelSerializer(serializers.ModelSerializer):
        """
        1、可以继承ModelSerializer,根据模型类来自动生成序列化器类中的字段
        2、必须得指定model参数(模型类),用于指定使用的模型
        3、会实现create、update方法
        4、会给主键字段、DataTimeField(指定auto_now_add和auto_now参数),会添加read_only=True
        5、会给有指定default参数的字段,添加required=False
        6、会给有指定null参数的字段,添加allow_null=True
        7、会给有指定blank参数的字段,添加allow_blank=True
        """
    
        # 方式一:
        # a.可以重新定义模型类中的字段
        # b.重新定义的字段会覆盖自动生成的同名字段
        # name = serializers.CharField(label='项目名称', help_text='项目名称', max_length=10, min_length=3,
        #                              error_messages={'min_length': '项目名称不能少于3位', 'max_length': '项目名称不能超过10位'},
        #                              validators=[
        #                                  UniqueValidator(queryset=Projects.objects.all(), message='项目名不能重复'),
        #                                  is_contain_keyword
        #                              ])
    
        # 可以将自定义的一个序列化器类作为另一个序列化器类中的字段
        interfaces = OneInterfaceSerilizer(label='所属接口信息', help_text='所属接口信息', read_only=True,
                                           many=True)
    
        # token = serializers.CharField(read_only=True)
        # email = serializers.EmailField(write_only=True)
    
        class Meta:
            model = Projects
            # 8、fields指定模型类中需要进行序列化操作的字段
            # a.'__all__',指定模型类中所有的字段都需要进行序列化操作
            # b.可以指定模型类中序列化操作的字段,需要在元组中指定
            # c.exclude指定不需要进行序列化操作的字段
            # d.如果指定了模型类中没有定义的字段,那么必须在fields元组中指定,如果fields为'__all__'或者exclude除外
            # fields = '__all__'
            # fields = ('id', 'name', 'leader', 'is_execute')
            fields = ('id', 'name', 'leader', 'is_execute', 'interfaces', 'token', 'email')
            # exclude = ('create_time', 'update_time', 'is_execute')
    
            # 可以在Meta内部类的read_only_fields,统一指定需要添加read_only=True的字段
            read_only_fields = ('is_execute', 'desc', 'id')
            # 方式二:
            # a.可以在Meta内部类的extra_kwargs中对自动生成的序列化字段进行修改
            # b.将需要修改的字段名作为key,具体修改的内容作为value
            extra_kwargs = {
                'name': {
                    'label': '项目名称',
                    'max_length': 10,
                    'min_length': 3,
                    'error_messages': {
                        'min_length': '项目名称不能少于3位',
                        'max_length': '项目名称不能超过10位'
                    },
                    'validators': [
                        UniqueValidator(queryset=Projects.objects.all(), message='项目名不能重复'),
                        is_contain_keyword
                    ],
                    'write_only': True
                }
            }
    
        def create(self, validated_data):
            user = validated_data.pop('user')
            score = validated_data.pop('score')
            return super().create(validated_data)
  • 相关阅读:
    人脸识别常用的性能评价指标
    【计算机视觉】seetaFace
    【error】'isnan' was not declared in this scope
    【opencv基础】图像的几何变换
    [c++]base64编解码 and image
    【leetcode】232-Implement Queue using Stacks
    【leetcode】231-power-of-two
    C++中vector容器的常用操作方法实例总结
    【leetcode】226-invert-binary-tree
    第3章 文件I/O(2)_文件I/O系统调用及文件描述符
  • 原文地址:https://www.cnblogs.com/erchun/p/14409045.html
Copyright © 2020-2023  润新知