drf : source,定制序列化字段以及反序列化新增。局部钩子(validate_字段名),全局钩子(validate)
source,SerializerMethodField,局部钩子,全局钩子
serialzer.py : source
用处对应字段:起别名,
用处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
合集:
python_django
分类:
编程相关 / Python
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了