1. 程式人生 > 其它 >drf : source,定製序列化欄位以及反序列化新增。區域性鉤子(validate_欄位名),全域性鉤子(validate)

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