为什么Django REST Framework序列化模型属性数据报AttributeError
报错根因拆解
- 报错核心是序列化器与待序列化对象类型完全错位,不存在序列化器字段拼写错误的问题:
AccountSerializer是专为Account模型设计的序列化逻辑,初始化时会按照Account模型的字段结构(name、user、is_loan等),从传入的实例上读取对应属性值Account模型的transfers属性返回值,是通过Ledger.objects.filter(...)获取的Ledger模型实例组成的查询集,不属于Account模型的实例集合- 当装载了Ledger对象的查询集传入AccountSerializer时,序列化器会强制从每个Ledger实例上读取
name字段,而Ledger模型本身不存在name属性,最终抛出'Ledger' object has no attribute 'name'的异常
- 直接传入Account对象给AccountSerializer时流程正常,本质是传入的实例类型和序列化器的适配目标完全匹配,不存在类型错位问题。
修复步骤
- 新建适配Ledger模型的独立序列化器,用于处理交易数据的序列化逻辑
class LedgerSerializer(serializers.ModelSerializer): class Meta: model = Ledger # 按需配置需要返回的字段即可,比如交易金额、时间、关联账户信息等 fields = '__all__'
- 修改视图中的序列化器调用逻辑,用匹配的序列化器处理
transfers属性返回的Ledger数据
class Transactions(APIView): def get(self, request, pk): account = Account.objects.get(pk=pk) transactions = account.transfers # 替换为适配Ledger对象的序列化器,不要复用AccountSerializer处理交易数据 serializer = LedgerSerializer(transactions, many=True) return Response(serializer.data)
避坑提醒
- 不要为了适配不匹配的序列化器,反向给Ledger模型添加多余的
name属性,这类反向设计会打乱代码逻辑边界,大幅提升后续维护成本 - DRF序列化器的核心设计逻辑是单个序列化器对应明确的模型序列化场景,跨模型类型传参是DRF开发中最常见的字段类报错诱因,和序列化器内部的字段配置正确性没有直接关联
内容的提问来源于stack exchange,提问作者nikulasoskarsson
相关产品推荐
相关产品推荐

