You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django一对多序列化器出现AttributeError问题求助

Django一对多模型序列化器AttributeError问题解决

错误原因

  1. related_name用法混淆:Client模型中ForeignKey的related_name是给关联模型(Project/Reason)做反向查询用的,比如通过Project.objects.get(id=1).projectname.all()可获取该项目下的所有客户,但Client实例本身并没有projectname这个属性,序列化器里写source="projectname"自然触发属性错误。
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 06:55:27