Django REST Framework序列化器详解

from rest_framework import serializers
from meituan.models import Merchant
#1、用来序列化数据,ORM->JSON
#2、用来验证表单数据。Form
#3、可以创建数据,修改数据等
#serializer的构造函数的参数
#4、instance:需要传道一个ORM对象,或者是一个queryset对象,用来将ORM 模型序列化成JSON
#5、data把需要验证的数据传给data,用来验证这些数据是不是符合要求。
#6、many如果instance是一个queryset对象,那么需要设置为True,否则为False

class MerchantSerializer(serializers.Serializer):
    id=serializers.IntegerField(read_only=True)
    name=serializers.CharField(max_length=200,required=True,error_messages={"required":"name必须要传"})
    logo=serializers.CharField(max_length=200,required=True)
    address=serializers.CharField(max_length=200,required=True)
    notice=serializers.CharField(max_length=200,required=False)
    up_send=serializers.DecimalField(required=False,max_digits=6,decimal_places=2)
    lon=serializers.FloatField(required=True)
    lat=serializers.FloatField(required=True)
    def update(self, instance, validated_data):
        instance.name=validated_data.get('name',instance.name)
        instance.logo=validated_data.get('logo',instance.logo)
        instance.address=validated_data.get('address',instance.address)
        instance.notice=validated_data.get('notice',instance.notice)
        instance.up_send=validated_data.get('up_send',instance.up_send)
        instance.lon=validated_data.get('lon',instance.lon)
        instance.lat=validated_data.get('lat',instance.lat)
        instance.save()

    def create(self,validated_data):
        return Merchant.objects.create(**validated_data)

这段代码定义了一个 Django REST Framework (DRF) 的序列化器 MerchantSerializer,用于处理商家数据的序列化、验证和数据库操作。让我为你详细解析:

1. 序列化器的作用

这个序列化器主要承担三个核心功能:

  1. 序列化: 将 Merchant 模型实例或查询集转换为 JSON 格式
  2. 验证: 验证传入的表单数据是否符合要求
  3. 数据操作: 创建和更新数据库记录

2. 字段定义详解

id = serializers.IntegerField(read_only=True)
# read_only=True 表示该字段只在序列化时使用,反序列化(创建/更新)时忽略

name = serializers.CharField(max_length=200, required=True, error_messages={"required":"name必须要传"})
# required=True 表示该字段必须提供
# error_messages 自定义错误消息

logo = serializers.CharField(max_length=200, required=True)
address = serializers.CharField(max_length=200, required=True)
notice = serializers.CharField(max_length=200, required=False)  # 可选字段
up_send = serializers.DecimalField(required=False, max_digits=6, decimal_places=2)
# DecimalField 用于精确小数,max_digits=6 总位数,decimal_places=2 小数位数

lon = serializers.FloatField(required=True)
lat = serializers.FloatField(required=True)

3. 核心方法解析

create() 方法

def create(self, validated_data):
    return Merchant.objects.create(**validated_data)
  1. 作用: 创建新的 Merchant 实例
  2. 参数: validated_data - 已经通过验证的数据
  3. 返回值: 新创建的 Merchant 实例

update() 方法

def update(self, instance, validated_data):
    instance.name = validated_data.get('name', instance.name)
    instance.logo = validated_data.get('logo', instance.logo)
    # 其他字段更新...
    instance.save()
  1. 作用: 更新现有的 Merchant 实例
  2. 参数:
    instance:要更新的现有对象
    validated_data:已经通过验证的新数据
  3. 逻辑: 使用 get() 方法安全地获取数据,如果新数据不存在则保持原值

4. 使用场景示例

序列化(ORM → JSON)

# 单个对象序列化
merchant = Merchant.objects.get(id=1)
serializer = MerchantSerializer(merchant)
json_data = serializer.data

# 查询集序列化(需要 many=True)
merchants = Merchant.objects.all()
serializer = MerchantSerializer(merchants, many=True)
json_data = serializer.data

反序列化验证(JSON → ORM)

# 创建数据
data = {'name': '测试商家', 'logo': 'logo.png', ...}
serializer = MerchantSerializer(data=data)
if serializer.is_valid():
    merchant = serializer.save()  # 调用 create() 方法
else:
    errors = serializer.errors

# 更新数据
merchant = Merchant.objects.get(id=1)
data = {'name': '新名称', ...}
serializer = MerchantSerializer(instance=merchant, data=data, partial=True)
if serializer.is_valid():
    updated_merchant = serializer.save()  # 调用 update() 方法

5. 重要注意事项

read_only 字段: id 字段设置为 read_only=True,因为在创建时不应该由客户端提供 ID
required 参数: 区分必填和选填字段,确保数据完整性
错误处理: 通过 error_messages 自定义错误消息,提高用户体验
部分更新: 使用 partial=True 允许部分字段更新

6. 改进建议

# 可以使用 ModelSerializer 简化代码
class MerchantSerializer(serializers.ModelSerializer):
    class Meta:
        model = Merchant
        fields = '__all__'
        extra_kwargs = {
            'name': {'error_messages': {'required': 'name必须要传'}},
            'id': {'read_only': True}
        }

这个序列化器是 DRF 中处理数据流转的核心组件,确保了数据的完整性、安全性和一致性。

简化代码说明

class MerchantSerializer(serializers.ModelSerializer):
    # 定义 MerchantSerializer 类,继承自 ModelSerializer
    class Meta:
        # Meta 类用于配置序列化器的元数据
        model = Merchant  # 指定关联的模型
        fields = "__all__"  # 包含模型的所有字段

1、ModelSerializer: DRF 提供的便捷类,自动根据模型生成序列化器
2、Meta 类: 配置序列化器的核心设置

  • model = Merchant: 指定关联的数据库模型
  • fields = “all”: 自动包含模型的所有字段

等价的手动实现

如果不用 all,你需要手动列出所有字段:

class MerchantSerializer(serializers.ModelSerializer):
    class Meta:
        model = Merchant
        fields = ['id', 'name', 'email', 'created_at', ...]  # 所有字段名

使用示例

# 序列化(对象 → JSON)
merchant = Merchant.objects.get(id=1)
serializer = MerchantSerializer(merchant)
json_data = serializer.data

# 反序列化(JSON → 对象)
data = {'name': '测试商户', 'email': 'test@example.com'}
serializer = MerchantSerializer(data=data)
if serializer.is_valid():
    merchant = serializer.save()

常用字段配置选项

除了 all,你还可以:

class Meta:
    model = Merchant
    fields = ['id', 'name', 'email']  # 只包含特定字段
    # exclude = ['password']  # 排除特定字段
    # read_only_fields = ['created_at']  # 只读字段

注意事项

  • 安全性: all 会暴露所有字段,确保没有敏感信息
  • 性能: 自动包含所有字段,可能包含不必要的数据
  • 灵活性: 对于复杂需求,可能需要自定义字段或重写方法

这种序列化器极大简化了 REST API 的开发工作。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值