You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于Django Rest Framework的序列化——如何实现反序列化?

在Django Rest Framework中实现自定义类的反序列化

嘿,我来帮你搞定这个自定义类的反序列化问题!首先得指出你当前代码里的小问题——你的MovieWithDescriptionSerializer用了Meta.model,但MovieWithDescription并不是Django的Model类,而是普通的Python类,所以这个写法行不通。要实现反序列化,我们需要明确定义序列化器字段,并告诉DRF如何将验证后的数据转换成你的自定义对象,具体步骤如下:

1. 修正序列化器的字段定义

首先要把序列化器的字段和你的MovieWithDescription类属性一一对应上,还要根据需求设置字段的可选性:

from rest_framework import serializers

class MovieWithDescriptionSerializer(serializers.Serializer):
    id = serializers.IntegerField()
    name = serializers.CharField(max_length=255)
    description = serializers.CharField()
    # rating和year是类里的默认值字段,设置为可选
    rating = serializers.CharField(allow_blank=True, required=False)
    year = serializers.IntegerField(required=False)

2. 重写create方法生成自定义对象

DRF默认不知道如何创建你的MovieWithDescription实例,所以必须重写create方法,把验证后的干净数据转换成对象:

首先可以先优化一下你的MovieWithDescription类,让它支持可选参数(这样能更好地处理rating和year字段):

class MovieWithDescription(object):
    id = 0
    name = ''
    description = ''
    rating = ''
    year = 0

    def __init__(self, uid, name, description, rating='', year=0):
        self.id = uid
        self.name = name
        self.description = description
        self.rating = rating
        self.year = year

然后在序列化器里添加create方法:

class MovieWithDescriptionSerializer(serializers.Serializer):
    # 上面的字段定义...

    def create(self, validated_data):
        # 从验证后的数据中取出参数,对应类的构造方法
        return MovieWithDescription(
            uid=validated_data['id'],
            name=validated_data['name'],
            description=validated_data['description'],
            rating=validated_data.get('rating', ''),
            year=validated_data.get('year', 0)
        )

3. 实际使用反序列化

现在你就可以用这个序列化器来处理数据,生成MovieWithDescription实例了:

# 模拟前端传入的字典数据
movie_data = {
    'id': 1,
    'name': 'Inception',
    'description': 'A mind-bending thriller about dreams within dreams',
    'rating': '9.0',
    'year': 2010
}

# 初始化序列化器,传入data参数(这是反序列化的关键,和序列化的many=True区分开)
serializer = MovieWithDescriptionSerializer(data=movie_data)

# 先验证数据合法性
if serializer.is_valid():
    # 调用save()会自动触发create方法,返回自定义对象
    movie_instance = serializer.save()
    print(movie_instance.name)  # 输出: Inception
else:
    # 如果验证失败,打印错误信息
    print(serializer.errors)

4. (可选)实现对象更新的update方法

如果你需要更新已有的MovieWithDescription实例,可以重写update方法:

class MovieWithDescriptionSerializer(serializers.Serializer):
    # 字段定义和create方法...

    def update(self, instance, validated_data):
        # 用验证后的数据更新实例属性,没有传入的字段保留原有值
        instance.id = validated_data.get('id', instance.id)
        instance.name = validated_data.get('name', instance.name)
        instance.description = validated_data.get('description', instance.description)
        instance.rating = validated_data.get('rating', instance.rating)
        instance.year = validated_data.get('year', instance.year)
        return instance

使用更新功能的示例:

# 已有一个MovieWithDescription实例
existing_movie = MovieWithDescription(1, 'Old Title', 'Old Description')

# 要更新的部分数据
update_data = {'name': 'Updated Title', 'year': 2023}

# 初始化序列化器,传入instance和data,partial=True允许部分字段更新
serializer = MovieWithDescriptionSerializer(existing_movie, data=update_data, partial=True)

if serializer.is_valid():
    updated_movie = serializer.save()  # 触发update方法
    print(updated_movie.name)  # 输出: Updated Title

内容的提问来源于stack exchange,提问作者Iwona Kubowicz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 11:11:02