【Django】DRF的模型类序列化器

比起自定义的序列化器,使用DRF已经写好的模型类序列化器可以大大简化代码,它主要有两个表现

(1)、根据指定的规则,自动映射字段参与序列化/反序列化
(2)、重写了create()和update()方法实现模型类对象的新建和更新逻辑

1.定义

新建一个类继承serializers.ModelSerializer
class BookInfoSerializer(serializers.ModelSerializer):
    """图书数据序列化器"""
    class Meta:
        model = BookInfo
        fields = '__all__'

Meta里的model指明参照哪个模型类,fields指明为模型类的哪些字段生成

2.指定字段

fields指定字段

class BookInfoSerializer(serializers.ModelSerializer):
    """图书数据序列化器"""
    class Meta:
        model = BookInfo
        fields = ('id', 'btitle', 'bpub_date')

exclude排除字段

class BookInfoSerializer(serializers.ModelSerializer):
    """图书数据序列化器"""
    class Meta:
        model = BookInfo
        exclude = ('image',)

read_only_fields只读字段

class BookInfoSerializer(serializers.ModelSerializer):
    """图书数据序列化器"""
    class Meta:
        model = BookInfo
        fields = ('id', 'btitle', 'bpub_date''bread', 'bcomment')
        read_only_fields = ('id', 'bread', 'bcomment')

extra_kwargs添加额外参数

class BookInfoSerializer(serializers.ModelSerializer):
    """图书数据序列化器"""
    class Meta:
        model = BookInfo
        fields = ('id', 'btitle', 'bpub_date', 'bread', 'bcomment')
        extra_kwargs = {
    
    
            'bread': {
    
    'min_value': 0, 'required': True},
            'bcomment': {
    
    'min_value': 0, 'required': True},
        }

3.示例代码

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

如果想使用自定义的序列化器可以参考
【Django】DRF自定义序列化器、序列化与反序列化

猜你喜欢

转载自blog.csdn.net/qq_39147299/article/details/108699283