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. 序列化器的作用
这个序列化器主要承担三个核心功能:
- 序列化: 将 Merchant 模型实例或查询集转换为 JSON 格式
- 验证: 验证传入的表单数据是否符合要求
- 数据操作: 创建和更新数据库记录
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)
- 作用: 创建新的 Merchant 实例
- 参数: validated_data - 已经通过验证的数据
- 返回值: 新创建的 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()
- 作用: 更新现有的 Merchant 实例
- 参数:
instance:要更新的现有对象
validated_data:已经通过验证的新数据 - 逻辑: 使用 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 的开发工作。
711

被折叠的 条评论
为什么被折叠?



