DRF-模型類序列化器

夢客y發表於2020-10-05

定義和使用

模型類序列化器功能:

  • 1)根據指定的規則,自動對映欄位參與序列化/反序列化
  • 2)重寫了 create 和 update 方法實現模型類物件的新建和更新邏輯
"""
使用模型類序列化器來操作模型類增刪改查
"""
from rest_framework import serializers
# serializers.ModelSerializer: 模型類序列化器基類
from .models import *

def check_btitle(value):
    if "django" not in value:
        raise serializers.ValidationError("這不是一本關於django的書")

class BookInfoModelSerializer(serializers.ModelSerializer):

    class Meta:
        # 1、宣告當前序列化器針對的模型類
        model = BookInfo # 潛臺詞,將來新建/更新的是BookInfo
        # 2、宣告參與序列化/反序列化的模型類欄位
        # 3、自動對映欄位(主鍵隱藏欄位自動對映,非主鍵隱藏欄位不會)
        fields = "__all__"
        # 4、顯示宣告參與序列化/反序列化的欄位
        # fields = ['btitle', 'bpub_date', 'id', 'heros']
        # 5、排除指定欄位,把其他欄位對映過來參與序列化/反序列化
        # exclude = ['btitle', 'bpub_date']

        # 6、調整欄位的約束條件
        extra_kwargs = {
            'bread': {'min_value': 0},
            'bcomment': {'min_value': 0},
            # btitle = serializers.CharField(validator=[check_btitle])
            # 'btitle': {'validators': [check_btitle]}
        }
        # 7、設定read_only=True的欄位
        # read_only_fields = ['id', 'btitle']

    # def validate_btitle(self, value):
    #     if "django" not in value:
    #         raise serializers.ValidationError("這不是一本關於django的書")
    #     return value
    
    def validate(self, attrs):
        # 自定義校驗
        return attrs

流程:

  • 定義模型類序列化器
  1. 宣告當前序列化器針對的模型類
  2. 宣告參與序列化/反序列化的模型類欄位
  3. 自動對映欄位(主鍵隱藏欄位自動對映,非主鍵隱藏欄位不會)
  4. 顯示宣告參與序列化/反序列化的欄位
  5. 排除指定欄位,把其他欄位對映過來參與序列化/反序列化
  6. 調整欄位的約束條件
  7. 設定read_only=True的欄位
  • 自定義校驗

相關文章