1. 程式人生 > >DRF序列化/反序列化

DRF序列化/反序列化

反序列化(不推薦版):
兩個欄位 一個為正序準備,一個為反序準備
重寫create update方法

1. 確定資料結構: 自己定義key
   book_obj = {
       "title": "語文sadasd",
       "pub_time": "2018-11-14",
       "post_category": 2,
       "publisher_id": 1,
       "authors_list": [1, 2]
}

2. 序列化器: 注意外來鍵,多對多,多選需要反序列化,其餘不用
   正序和反序列化欄位不統一: 

   1. 注意id 只序列化不走校驗(required=False)
      id 
= serializers.IntegerField(required=False) 2. 注意選擇 # 正序用 category = serializers.CharField(source="get_category_display", read_only=True) # 只能反序用 新增分類 post_category = serializers.IntegerField(write_only=True) 3. 注意外來鍵 publisher = PublisherSerializer(read_only=True) publisher_id
= serializers.IntegerField(write_only=True) 4. 注意多對多 authors = AuthorSerializer(many=True, read_only=True) authors_list = serializers.ListField(write_only=True) 4. 重寫create方法 def create(self, validated_data): book_obj = 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 3. 驗證通過返回ser_obj.validated_data 4. 驗證不通過返回ser_obj.errors

 

欄位校驗: 權重: 自定義>單個>多個

# 自定義驗證函式,需要加在類的前面, 然後哪個欄位需要校驗,哪個欄位中新增 validators=[my_validate]
    def my_validate(value):
        if "敏感資訊" in value.lower():
            raise serializers.ValidationError("❌有敏感詞彙")
        return value

    # 單個欄位校驗
    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 "xxx" in attrs['title'].lower() or attrs['post_category']==1:
            raise serializers.ValidationError('出錯了')
        return attrs

 

ModelSerializer:

關聯哪個欄位,獲取到哪個欄位的全部資訊
外來鍵關係還是k為數字
需要重寫正序欄位

class BookSerializer(serializers.ModelSerializer):
    # 自定製 重寫欄位 需要重寫正序,反序用預設
    category_display = serializers.SerializerMethodField(read_only=True)
    publisher_info = serializers.SerializerMethodField(read_only=True)
    authors_info = serializers.SerializerMethodField(read_only=True)

    # 鉤子函式顯示外來鍵資訊 obj:每次序列化的模型物件
    def get_category_display(self, obj):
        # obj是序列化的每個Book物件
        return obj.get_category_display() # 自定義要返回的內容

    def get_publisher_info(self, obj):
        publisher_obj = obj.publisher
        return {'id': publisher_obj.id, 'title': publisher_obj.title}

    def get_authors_info(self, obj):
        authors_queryset = obj.authors.all()
        return [{"id": author.id, "name": author.name} for author in authors_queryset]

    class Meta:
        model = Book 表名字
        fields = '__all__'
        # depth = 1 # 所有欄位都拿出來一般不用, 會讓所有的外間關係變成read_only = Trur
extra_kwargs = {
            'publisher': {'write_only': True},
            'authors': {'write_only': True},
        }
       # extra_kwargs={"預設的欄位名稱":{自定義的引數配置資訊}}