1. 程式人生 > >92 序列化 反序列化

92 序列化 反序列化

clas att ida 統一 print -c 更新數據 參數 eth

主要內容:

1 反序列化(post請求)

  a : 提交post請求, 先確定新增的數據結構,

  b: 解決序列化和反序列化的字段不統一的情框(序列化器中有的字段, 要序列化的字段必須有.)

    required = False, 只序列化, 不走校驗

    read_only: 只走序列化

    write_only: 只走反序列化

  c: 對於前端傳過來的數據進行校驗. 要觸發反序列化過程中的create方法,

 def create(self, validated_data):
        # 使用orm操作創建對象
        book_obj = models.Book.objects.create(title=validated_data[‘title‘],pub_time=validated_data[‘pub_time‘], category=validated_data[‘post_category‘], publisher_id=validated_data[‘publisher_id‘])
        book_obj.authors.add(*validated_data[‘authors_list‘])
        return book_obj

  d: 通過驗證返回ser_obj.validated_data, 不通過驗證返回ser_obj.errors

2 反序列化put請求

  a : 提交put請求, 更新數據

  b : 反序列化時, 要把反序列化的對象傳給對應的instance實例, data = request.data, partial=true部分更新.

  c : 反序列化跟新時觸發update方法:

    def update(self, instance, validated_data):
        # 使用orm操作編輯對象
        print(instance)             # 更新的book_obj對象
        print(validated_data)       # 校驗通過的數據
        instance.title = validated_data.get(‘title‘, instance.title)
        instance.pub_time = validated_data.get(‘pub_time‘, instance.pub_time)
        instance.category = validated_data.get(‘post_category‘, instance.category)
        instance.publisher_id = validated_data.get(‘publisher_id‘, instance.publisher_id)
        if validated_data.get(‘authors_list‘):
            instance.authors.set(validated_data[‘authors_list‘])
        instance.save()
        return instance

  d : 驗證通過返回ser_obj.validated_data, 不通過返回ser_obj.errors

  e : 單個字段的校驗:(權重中間)

    def validate_title(self, value):
    # value就是title的值 對value處理
        if "python" not in value.lower():
            raise serializers.ValidationError("標題必須含有python")
        return value

    多個字段的校驗:(權重最低)

    # # 檢驗多個字段
    # def validate(self, attrs):    attrs是一個字典
    #     if ‘bad language‘ not in attrs[‘title‘] and attrs[‘post_category‘] == 1:
    #         return attrs
    #     else:
    #         raise serializers.ValidationError(‘有敏感信息‘)

    自定義字段校驗(權重最高)

def my_validate(value):
    print(‘this  is validate‘,value)
    if ‘麗麗‘in value.lower():
        raise serializers.ValidationError(‘不嚴謹‘)
    return value

      註意:給字段配置validators = [my_validate]

class BookSerializer(serializers.Serializer):
#     # 序列化器中有的字段對象中必須有
#     title = serializers.CharField(max_length=32, validators=[my_validate, ])

3 ModelSerializer: 由於自定義序列化器類比較麻煩, 還要寫create,update方法, 所以引入了ModelSerializer.

    a : 定義一個類繼承serializers.ModelSerializer : 會讓你這些所有的外鍵關系變成read_only = True

    b : 在類裏面定義一個meta類,

      類裏面的字段model等於表名,

      fieds等於所有的字段: fields = "__all__"

      depth: 表示層級關系, 最好不要超過三級,

      extra_kwargs = {‘字段名稱‘,‘自定義的參數配置信息‘ }

    c : 自定義方法字段: SerializerMethodField() 方法字段

            def get_字段名稱(self, obj):

               obj 每次序列化的模型對象

               return 自定義的數據

    d : 實例:

      自定義校驗方法字段, 顯示自己需要的內容, 解決depth存在的問題(顯示出全部的內容)  

    authors = serializers.SerializerMethodField()
    def get_authors(self, obj):
        print(obj)
        author_query = obj.authors.all()
        return [{‘id‘:author.id, ‘name‘:author.name} for author in author_query]

      為了解決序列化和反序列化存在的字段不一致問題的解決方案:

    authors_info = serializers.SerializerMethodField()
    def get_authors_info(self, obj):
        authors_query = obj.authors.all()
        return [{‘id‘:author.id, ‘name‘: author.name} for author in authors_query]

        並在meta中設置extra_kwargs = {‘對應的字段‘:{write_only}: true}(只作為反序列化用)

    

92 序列化 反序列化