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


