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

Django ViewSet序列化模型外仅写字段时出现字段丢失问题

问题解决:Django ModelViewSet中自定义write_only字段丢失的处理

你的代码存在两个核心问题,导致documents字段无法被正确识别和处理:

1. 字段定义拼写错误

在BankSerializer中,name字段的序列化器调用写错了:

name = serializer.CharField()  # 缺少末尾的s,应为serializers

正确写法:

name = serializers.CharField()

这个拼写错误会导致序列化器初始化异常,进而无法正确加载你定义的documents字段。

2. create方法未适配模型外字段

documents是模型中不存在的字段,默认的ModelSerializer.create会尝试将所有验证后的数据传给模型的创建方法,但模型不接受该字段。你需要先从验证数据中取出documents,再创建模型实例。

修正后的完整代码:

模型类(无修改)

class Bank(models.Model):
    name = models.CharField(max_length=255)
    
    objects = models.Manager()

序列化器类

from rest_framework import serializers

class BankSerializer(serializers.ModelSerializer):
    id = serializers.IntegerField(read_only=True)
    name = serializers.CharField()  # 修复拼写错误
    documents = serializers.ListField(write_only=True)

    class Meta:
        model = Bank
        fields = ['id', 'name', 'documents']

    def create(self, validated_data):
        # 取出模型不包含的字段,避免创建实例时出错
        documents = validated_data.pop('documents', None)
        # 创建Bank实例
        bank = Bank.objects.create(**validated_data)
        # 此处可添加对documents的后续业务逻辑处理,比如关联其他模型
        print(documents)  # 现在能正常打印传入的documents数据
        return bank

视图集类

from rest_framework import viewsets

class BankViewset(viewsets.ModelViewSet):
    serializer_class = BankSerializer
    queryset = Bank.objects.all()  # 补充queryset,ModelViewSet必须指定该属性

额外说明

  • write_only=True的字段仅在接收请求数据(反序列化)时生效,返回响应(序列化)时不会包含该字段,这是符合设计预期的。
  • ModelViewSet必须指定queryset属性,否则会抛出配置异常,你的原代码遗漏了这部分。

内容的提问来源于stack exchange,提问作者ebenezer popoola

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 00:20:24