DRF序列化/反序列化
阿新 • • 發佈:2018-11-15
反序列化(不推薦版):
兩個欄位 一個為正序準備,一個為反序準備
重寫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={"預設的欄位名稱":{自定義的引數配置資訊}}