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
posted @ 2022-04-01 17:02  谢俊杰  阅读(79)  评论(0编辑  收藏  举报