如何在Serializer中添加模型不存在的字段?解决AttributeError报错
在Django REST Framework序列化器中添加模型不存在的字段的解决方法
你遇到的报错是因为序列化器默认会尝试从DescPersonne_Prod模型实例中读取etat_civil字段,但模型本身没有这个属性,所以抛出了AttributeError。下面是几种可行的解决方式:
1. 用SerializerMethodField实现自定义计算字段
这是最常用的方式,适合需要基于模型现有属性计算或从其他关联数据来源获取值的场景:
from rest_framework import serializers from .models import DescPersonne_Prod class Serializer_Professeur_Assistant(serializers.ModelSerializer): # 声明自定义字段 etat_civil = serializers.SerializerMethodField() class Meta: model = DescPersonne_Prod fields = ('id', 'nom', 'prenom', 'etat_civil') # 把自定义字段加入返回字段列表 # 必须实现get_<字段名>方法,返回字段具体值 def get_etat_civil(self, obj): # 这里写你的业务逻辑,比如根据模型现有字段拼接、从关联模型取值等 # 示例:假设根据nom字段生成状态 return f"{obj.nom} 的婚姻状态:已婚"
2. 用ReadOnlyField设置固定/上下文来源的只读字段
如果字段是只读的,值固定或者来自请求上下文(比如当前用户信息),可以用这个方式:
class Serializer_Professeur_Assistant(serializers.ModelSerializer): # 固定值示例 etat_civil = serializers.ReadOnlyField(default="未婚") # 从上下文获取值的示例(需要取消注释) # etat_civil = serializers.SerializerMethodField() # def get_etat_civil(self, obj): # request = self.context.get('request') # return request.user.profile.marital_status class Meta: model = DescPersonne_Prod fields = ('id', 'nom', 'prenom', 'etat_civil')
3. 处理需要写入的自定义字段(仅接收前端数据,不存入模型)
如果这个字段需要接收前端传入的数据,但不需要保存到当前模型,比如用来触发其他业务逻辑,可以设置write_only=True:
class Serializer_Professeur_Assistant(serializers.ModelSerializer): etat_civil = serializers.CharField(write_only=True) class Meta: model = DescPersonne_Prod fields = ('id', 'nom', 'prenom', 'etat_civil') def create(self, validated_data): # 取出前端传入的etat_civil值做处理 etat_civil = validated_data.pop('etat_civil') # 这里写你的业务逻辑,比如调用第三方接口、更新其他模型等 # ... # 继续执行模型实例的创建逻辑 return super().create(validated_data)
内容的提问来源于stack exchange,提问作者Msaidai11
相关产品推荐
相关产品推荐

