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)
原文地址:https://www.cnblogs.com/erchun/p/14409045.html