Django rest framework ---Serializers

    xiaoxiao2025-11-06  2

    Serializers可以把复杂的数据结构例如querysets, 模型实例转化为python的数据格式。

     

    from datetime import datetime class Comment(object): def __init__(self, email, content, created): self.email = email self.content = content self.created = created comment = Comment('admin@163.com', 'test rest framework', '2016-08-15 14:20:00')

    创建一个serializer类:

     

     

    from rest_framework import serializers class CommentSerializer(serializers.Serializer): email = serializers.EmailField() content = serializers.CharFIeld(max_length=128) created = serializers.DateTimeField()

    创建一个serializer对象

     

     

    serializer = CommentSerializer(comment) serializer.data # dict

    我们可以把它装换成json

     

     

    from rest_framework.renders import JSONRenderer content = JSONRenderer().render(serializer.data) #json

    反序列化:

     

     

    from django.utils.six import BytesIO from rest_framework.parsers import JSONParser stream = BytesIO(content) data = JSONParser().parse(stream) serializer = CommentSerializer(data=data) serializer.is_valid() serializer.validated_data

    ------------------------------------------------------------------------------------------------

     

    保存实例

    如果我们想返回基于有效数据的对象实例,我们需要重写create 或者 update方法

     

    from rest_framework import serializers class CommentSerializer(serializers.Serializer): email = serializers.EmailField() content = serializers.CharField(max_length=128) created = serializers.DateTimeField() def create(self, validate_data): return Comment(**validate_data) def update(self, instance, validate_data): instance.email = validata_data.get('emial', instance.email) instance.content = validata_data.get('content', instance.content) instance.created = validate_data.get('created', instancle.created) return instance

    如果Comment是django的模型,你可以这样做把数据保存到数据库中

     

     

    from rest_framework import serializers class CommentSerializer(serializers.Serializer): email = serializers.EmailField() content = serializers.CharField(max_length=128) created = serializers.DateTimeField() def create(self, validate_data): return Comment.objects.create(**validate_data) def update(self, instance, validate_data): instance.email = validata_data.get('emial', instance.email) instance.content = validata_data.get('content', instance.content) instance.created = validate_data.get('created', instancle.created) instance.save() return instance

    我们可以调用.save方法,返回一个对象实例

     

     

    comment = serializer.save()

    .save()方法要么是创建一个新的实例,要么是更新一个已经存在的实例,这取决于你给它传的值

     

     

    serializer = CommentSerializer(data=data) # 创建一个新的实例 serializer = CommentSerializer(comment, data=data) # 更新comment

    .save() 传递额外的参数(传递关键字参数)

     

    serializer.save(owner=request.user)

    当调用create or update方法时,关键字参数会被包含在validate_data中

     

    ---------------------------------------------------------------------------------

    有效性

    在序列化数据之前,你需要调用is_valid()方法,如果有效性出错,你可以在.errors属性中查询错误信息

     

    serializer = CommentSerializer(data={'email': 'as@163.com', 'content': ' python code'}) serializer.is_valid() serializer.errors

     

    验证字段的有效性

    如果你想验证一个字段的有效性,可以在Serializer的子类中实现 validate_<field_name>方法

     

    from rest_framework import serializers class BlogPostSerializer(serializers.Serializer): title = serializers.CharField(max_length=128) content = serializers.CharField() def validate_title(self, value): if 'django' is not in value.lower(): raise serializers.ValidationError(' blog not about django') return value

    Note: 如果你的field_name在serializer中声明为require=False, 而你又没有声明validate_<field_name>方法,那么在validation过程中是不会检查这个字段的

     

    -----------------------------------------------------------------------------------

    部分更新

    一般来说,你需要把所有require=True的所有字段都更新,但是你可以通过指定partial参数来实现部分更新

     

    comment = CommentSerializer(data={'content': 'python code'}, partial=True)

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

    转载请注明原文地址: https://ju.6miu.com/read-1303917.html
    最新回复(0)