Django Rest Framework嵌套序列化报错RelatedManager无type属性如何解决
问题根因
你遇到的两个错误分别对应两个逻辑漏洞:
- 初始的
'RelatedManager' object has no attribute 'type'报错:因为Sequence和SequenceValue是一对多关联,Sequence_details是关联管理器对象,对应多个SequenceValue实例,序列化器默认按单个实例处理,无法直接从管理器上读取字段属性,必须加many=True参数声明这是数组类型。 - 加了
many=True后无法正常获取详情:因为你原来的create方法只处理单个SequenceValue对象,而加了many=True后校验通过的Sequence_details是列表格式,直接传给create方法会报错,导致关联数据没有正确入库,查询时自然拿不到详情字段。
修复步骤
1. 修正序列化器关联字段声明
给Sequence_details字段加many=True参数:
class SequenceSerializer(serializers.ModelSerializer): # 增加many=True声明这是一对多的数组字段 Sequence_details = SequenceValueSerializer(many=True) class Meta: model = Sequence fields = '__all__'
2. 重写create方法适配数组格式的关联数据
遍历校验后的Sequence_details列表,逐个创建关联的SequenceValue对象:
def create(self, validate_data): Sequence_details_data = validate_data.pop('Sequence_details') # 创建主表Sequence对象 sequence = Sequence.objects.create(**validate_data) # 循环创建关联的SequenceValue对象 for detail_data in Sequence_details_data: SequenceValue.objects.create(sequence_id=sequence, **detail_data) return sequence
可选优化建议
你当前的外键命名不符合Django规范,比如Sequence表的category_id是外键字段,Django会自动在数据库中生成category_id_id的存储字段,容易造成混淆,建议把外键字段的_id后缀去掉,ORM会自动处理关联和ID存储的映射:
# models.py修改示例 class Sequence(models.Model): # 去掉_id后缀 category = models.ForeignKey(SequenceCategory, on_delete=models.CASCADE) # 其余字段保持不变
修改后请求参数里的字段对应改为category: 3即可。
内容的提问来源于stack exchange,提问作者Sarath Chandran
相关产品推荐
相关产品推荐

