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

Django重写ViewSet的create方法后serializer未调用to_internal_value问题

问题原因

to_internal_value 是Django REST Framework序列化器反序列化阶段的钩子函数,只有当你把外部输入的原始数据传入序列化器、触发反序列化/校验逻辑时才会被调用。
你自定义的create方法完全跳过了序列化器的反序列化步骤:直接手动从request.data中取字段赋值给模型实例、直接保存,只有最后返回响应时用到了序列化器做序列化输出,这个阶段只会调用to_representation,自然不会触发to_internal_value。
默认的ModelViewSet.create方法内部会自动执行序列化器的反序列化校验逻辑,所以没有重写的时候方法可以正常触发。

修复方案

修改你的自定义create方法,保留序列化器的反序列化步骤即可,示例代码如下:

from rest_framework import status
from rest_framework.response import Response

class ContactViewSet(viewsets.ModelViewSet):
    queryset = ContactInformation.objects.all()
    serializer_class = TemplatesSerializer
    
    def create(self, request, *args, **kwargs):
        # 传入请求数据初始化序列化器,触发反序列化逻辑,调用to_internal_value
        serializer = self.get_serializer(data=request.data)
        # 执行参数校验,校验失败会自动抛出异常
        serializer.is_valid(raise_exception=True)
        # 保存序列化器校验后的合法数据到数据库
        contact = serializer.save()
        # 序列化返回阶段会自动调用to_representation
        return Response(serializer.data, status=status.HTTP_201_CREATED)

如果需要自定义保存逻辑,可以在serializer.is_valid()通过之后,修改serializer.validated_data的内容,或者手动给serializer.save()传额外参数即可,不需要手动给模型字段赋值。

内容的提问来源于stack exchange,提问作者Rizwanul Ratul

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 08:15:04