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
posted @   冀未然  阅读(9)  评论(0编辑  收藏  举报
(评论功能已被禁用)
相关博文:
阅读排行:
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示