drf : source,定制序列化字段以及反序列化新增。局部钩子(validate_字段名),全局钩子(validate)
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