drf : source,定製序列化欄位以及反序列化新增。區域性鉤子(validate_欄位名),全域性鉤子(validate)
阿新 • • 發佈:2022-04-01
source,SerializerMethodField,區域性鉤子,全域性鉤子
serialzer.py : source
用處1對應欄位:起別名,
用處2對應方法:在表模型中定義一個方法,source可以與其關聯
用處3對應方法:可以當做欄位
第三種方法的擴充套件用法:使用程度高。
model.py
from django.db import models # Create your models here. class Books(models.Model): name = models.CharField(max_length=32) price = models.IntegerField() publish = models.ForeignKey(to='Publish',on_delete=models.DO_NOTHING) # 方法 def publish_detail(self): """ 從books表查publish表,外來鍵欄位在books,正向查詢欄位名 self為當前books物件 .publish 就是publish物件 :return: """ return {'name':self.publish.name,'addr':self.publish.addr} class Publish(models.Model): name = models.CharField(max_length=32) addr = models.CharField(max_length=32)
在序列化類中寫方法
反序列化:資料的驗證,欄位自己的校驗規則,區域性鉤子,全域性鉤子。
上面資料的儲存updata沒有校驗資料,現在加上校驗。
Serializers.py
# 需要序列化和反序列化Book表 class PublishSerializers(serializers.Serializer): # 1.寫欄位(需要序列化,反序列化的欄位),欄位校驗 name = serializers.CharField(max_length=8, min_length=3) addr = serializers.CharField(max_length=8, min_length=3) # 2.區域性鉤子 def validate_name(self, name): if name.startswith('sb'): raise ValidationError('不能以sb開頭') else: return name # 3.全域性鉤子 def validate(self, attrs): name = attrs.get('name') print(name) addr = attrs.get('addr') print(addr) return attrs # 新增需要重寫create def create(self, validated_data): publish = Publish.objects.create(**validated_data) return publish
丟擲錯誤資訊
is_valid()方法還可以在驗證失敗時丟擲異常serializers.ValidationError,可以通過傳遞raise_exception=True引數開啟,REST framework接收到此異常,會向前端返回HTTP 400 Bad Request響應。
from rest_framework.exceptions import ValidationError