Django使用PostgreSQL时ManyToManyDescriptor无add属性报错如何解决
错误原因
报错的核心是调用多对多字段的主体错误:correctAnsRef是定义在Questions模型类上的字段,直接用类名Questions调用时,拿到的是字段描述符对象,不是绑定到具体数据实例的多对多管理器,因此没有add方法。多对多字段的add、remove等关联操作,必须调用在已保存到数据库的具体模型实例上,不能直接用模型类调用。
修复方案
直接修改报错行
把报错的Questions.correctAnsRef.add(correctAnsObj)替换为用你已创建的问题实例调用即可:
questionObj.correctAnsRef.add(correctAnsObj)
代码优化建议
你当前的代码存在多处冗余操作,可以简化:
- 你已经执行了
correctAnsObj.questionRef.add(questionObj),如果你的两个多对多字段是要维护同一套关联关系,只要在其中一边添加关联即可,不需要两边重复调用add。 - 用
objects.create()创建的模型实例会自动写入数据库,不需要额外调用一次save()。 - 模型定义存在冗余:同时在两个模型中定义指向对方的
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
相关产品推荐
相关产品推荐

