如何在Django中以字典键为动态字段名添加多对多字段值
解决方案
你的错误原因是直接调用了ManyToManyField字段对象的add方法,但add是多对多关联管理器的方法,并非字段对象本身的方法。你需要通过实例对象获取对应字段的关联管理器,而非从_meta中提取字段对象。
修改后的循环代码如下:
for key, val in device_dict.items(): # 动态获取实例上的多对多字段管理器 getattr(instance, key).add(val)
补充说明
- 请确保
device_dict内的所有键都是ProductAttributes模型中定义的多对多字段名。如果字典中包含外键或普通字段(比如你的watch_connectivity看起来是整数类型字段),需要区分处理:from django.db import models for key, val in device_dict.items(): field = instance._meta.get_field(key) if isinstance(field, models.ManyToManyField): getattr(instance, key).add(val) else: # 普通字段或外键直接赋值 setattr(instance, key, val) # 普通字段赋值后需保存实例 instance.save() - 多对多字段调用
add后无需额外执行instance.save(),关联管理器会直接操作中间表;但普通字段修改后必须调用save()才能将变更同步到数据库。
内容的提问来源于stack exchange,提问作者Abzal Ali
相关产品推荐
相关产品推荐

