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
相关产品推荐
相关产品推荐

