Django从ManyToMany关系中删除对象


112

如何在不删除实际对象的情况下从多对多关系中删除对象?

例:

我有模型MoodsInterest

Mood有一个多对多字段interests(这是一个models.ManyToManyField(Interest))。

我创建了一个Moods名为的实例my_mood。在my_moods我的兴趣领域my_interest

>>> my_mood.interests.all()
[my_interest, ...]

如何my_interest从中my_mood删除而不删除任何模型实例?换句话说,如何删除关系而不影响相关模型?

Answers:



65

如果您需要在不接触基础对象的情况下删除所有M2M引用,则从另一个方向进行操作会更容易:

interest.mood_set.clear()

尽管这不能直接解决OP的问题,但在这种情况下通常很有用。


10
为什么这被否决?当然,它并没有专门解决OP的问题,但是我留下了答案,因为它对于那些致力于消除M2M上下文中的关系并且消除了遍历实例的人们特别感兴趣。我认为这是一个有用的相关提示。
shacker

2
这对我很有用(我正要遍历,不想这么做)。感谢您发布!
bwv549

1
如果您仅在上述答案中添加这一点,那就更好了
brainLoop

1
或在模型中具有相关名称,以及interest.relatedname.clear()
乔什(Josh)

11

就您而言,您只需清除关系

my_mood.interests.clear()

然后,也许当您再次在序列化器中创建新关系时,您可以执行以下操作

interests = Interests.objects.get_or_create(name='Something')
my_mood_obj.tags.add(tag[0])
my_mood_obj.save()
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.