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
标签:
drf : 局部钩子
, drf : 全局钩子
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)