Django使用m2m_changed信号存入历史选课用户报错解决
你出现TypeError的核心原因是,model参数是CustomUser类本身,不是具体的用户实例,add()方法需要传入具体的模型实例或者主键值,传入类自然会触发类型错误。
你需要用到信号回调里的pk_set参数,这个参数在pre_remove动作触发时,会存储本次要从enrolled_users中移除的所有用户的主键值,直接把这些主键传给previous_enrolled_users的add方法即可,完整代码如下:
def listen_m2mchange(sender, instance, model, pk_set, action, **kwargs): if action == 'pre_remove': # 对pk_set拆包后传入add方法,支持批量添加 instance.previous_enrolled_users.add(*pk_set) m2m_changed.connect(listen_m2mchange, sender=Course.enrolled_users.through)
补充说明:
- 多对多字段的
add方法原生支持直接传入主键值,不需要额外查询用户实例,执行效率更高 - 多对多字段默认会自动去重,即使用户已经在
previous_enrolled_users列表中,重复调用add也不会生成冗余的关联记录 - 选择
pre_remove动作是正确的,如果改为post_remove,pk_set会被清空,无法获取到本次移除的用户主键
内容的提问来源于stack exchange,提问作者André Carvalho
相关产品推荐
相关产品推荐

