Django中动态操作多对多(M2M)字段报错,如何用变量实现?
解决Django动态调用多对多字段添加数据的问题
错误原因
你代码里的attribute.m2m_model.add(...)写法有误——Python会把m2m_model当成ProductAttributes的固定属性名,而不是你变量中存储的字段名(比如color、ram),所以触发AttributeError。
解决方案
使用Python内置的getattr()函数,动态获取ProductAttributes实例中对应字段名的多对多字段对象,再调用add()方法。
修改后的代码:
attribute = ProductAttributes.objects.get(pk=pk) for key in common_keys: if initial[key] != new_data[key]: # 动态获取对应多对多字段 m2m_field = getattr(attribute, key) m2m_field.add(new_data[key])
补充说明
- 你的
common_keys应该是['color', 'band_color', 'ram', 'vram']这类字段名字符串,直接用key作为getattr的第二个参数即可,不需要通过apps.get_model去获取模型名称。 - 如果
new_data[key]是多个对象(比如QuerySet),可以用*解包后传入add(),比如m2m_field.add(*new_data[key])。
内容的提问来源于stack exchange,提问作者Abzal Ali
相关产品推荐
相关产品推荐

