带中间模型的Django ManyToManyField调用remove()报错,无中间模型时正常
解决带中间模型的ManyToManyField无法使用remove()的AttributeError问题
你遇到的这个报错其实是Django的正常限制:当你的ManyToManyField指定了中间模型(也就是through='Playlist_Activity')时,Django会禁用add()、remove()、clear()这些便捷方法。原因很简单——中间模型里可能包含额外的字段(比如你的Playlist_Activity有timestamp),Django没办法自动处理这些额外数据的增删,所以要求你直接操作中间模型的管理器。
针对你的代码,只需要修改Views.py里的Playlist_Remove函数,直接删除中间模型对应的实例即可:
@login_required def Playlist_Remove(request, id, P_id): # 直接通过中间模型的Manager删除关联记录 Playlist_Activity.objects.filter(song_id=id, playlist_id=P_id).delete() return redirect('account')
补充说明:
- 原来的代码里
p.song.get(id=id)其实没必要,我们可以直接用song_id和playlist_id过滤中间模型,这样更高效 - 如果之后需要给歌单添加歌曲,同样不能用
p.song.add(s),而是要创建Playlist_Activity的实例:# 示例:添加歌曲到歌单 Playlist_Activity.objects.create(song_id=id, playlist_id=P_id)
这样就能绕过Django的限制,正确处理带中间模型的多对多关联增删操作了。
内容的提问来源于stack exchange,提问作者HAN YAO FOONG
相关产品推荐
相关产品推荐

