Django一对多序列化器出现AttributeError问题求助
Django一对多模型序列化器AttributeError问题解决
错误原因
- related_name用法混淆:
Client模型中ForeignKey的related_name是给关联模型(Project/Reason)做反向查询用的,比如通过Project.objects.get(id=1).projectname.all()可获取该项目下的所有客户,但Client实例本身并没有projectname这个属性,序列化器里写source="projectname"自然触发属性错误。 - many=True参数误用:
Client与Project/Reason是多对一关系(一个客户对应一个项目/原因),并非一对多,因此序列化字段不需要添加many=True。
修正方案
修正序列化器代码
直接使用Client模型中定义的字段名project和reason作为序列化字段,无需指定source,同时移除错误的many=True参数:
class projectserializers(serializers.ModelSerializer): class Meta: model = Project fields = ('id', 'project_name') class reasonserializers(serializers.ModelSerializer): class Meta: model = Reason fields = ('id', 'reason_name') class clientserializers(serializers.ModelSerializer): project = projectserializers() reason = reasonserializers() class Meta: model = Client fields = ('id', 'name', 'timestamp', 'project', 'reason')
可选:优化模型的related_name(若需反向查询)
如果后续需要从Project/Reason反向查询关联的Client,建议把related_name改得更直观,比如clients,语义更清晰:
class Client(db.Model): name = db.CharField(max_length=100) project = db.ForeignKey(Project, on_delete=db.CASCADE, related_name="clients") reason = db.ForeignKey(Reason, on_delete=db.CASCADE, related_name="clients") timestamp = db.DateTimeField(default=timezone.now)
注意:
timezone.now不要加括号,否则会在模型加载时就固定时间,而非创建实例时生成当前时间。
验证效果
视图代码无需修改,重新发起请求即可正常序列化Client数据,返回包含关联Project和Reason详情的JSON响应。
内容的提问来源于stack exchange,提问作者se6
相关产品推荐
相关产品推荐

