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

Django使用PostgreSQL时ManyToManyDescriptor无add属性报错如何解决

错误原因

报错的核心是调用多对多字段的主体错误:correctAnsRef是定义在Questions模型类上的字段,直接用类名Questions调用时,拿到的是字段描述符对象,不是绑定到具体数据实例的多对多管理器,因此没有add方法。多对多字段的add、remove等关联操作,必须调用在已保存到数据库的具体模型实例上,不能直接用模型类调用。

修复方案

直接修改报错行

把报错的Questions.correctAnsRef.add(correctAnsObj)替换为用你已创建的问题实例调用即可:

questionObj.correctAnsRef.add(correctAnsObj)

代码优化建议

你当前的代码存在多处冗余操作,可以简化:

  1. 你已经执行了correctAnsObj.questionRef.add(questionObj),如果你的两个多对多字段是要维护同一套关联关系,只要在其中一边添加关联即可,不需要两边重复调用add。
  2. 用objects.create()创建的模型实例会自动写入数据库,不需要额外调用一次save()。
  3. 模型定义存在冗余:同时在两个模型中定义指向对方的ManyToManyField,会在数据库生成两张独立的关联表,两个关联关系互不同步,属于不必要的设计。只需要保留其中一个ManyToManyField即可,反向查询可以通过related_name实现。
    比如删除CorrectAns中的questionRef字段,后续要从答案实例查询关联的问题时,直接调用correctAnsObj.questionReletedResponses即可。

优化后的代码示例:

for i in QuestionsList:
    # 用create方法直接创建并保存实例,无需单独调用save
    questionObj = Questions.objects.create(
        questionId = i['Id'],
        groupId = i['GroupId'],
        questionTitle = i['QuestionTitle'],
    )
    for j in i['Responses']:
        correctAnsObj = CorrectAns.objects.create(
            ansId = j['Id'],
            responseText1 = myResponseText1,
            isDeleted = j['IsDeleted'],
        )
        # 仅在一边添加关联即可自动同步反向关系
        questionObj.correctAnsRef.add(correctAnsObj)
return

内容的提问来源于stack exchange,提问作者Kanchon Gharami

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 01:36:07