2011-06-13 143 views
58

如何从多对多关系中删除对象而不删除实际的对象?Django从ManyToMany关系中删除对象

例子:

我有模型MoodsInterest

'心情'有一个多对多的字段interests(这是一个models.ManyToManyField(Interest))。

我创建了一个名为my_moodMoods的实例。在my_moods的利益场我有my_interest,这意味着

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

如何删除从my_mood my_interest,但不删除任何模型实例?换句话说,我如何在不影响相关模型的情况下移除关系?

回答

96
my_mood.interests.remove(my_interest) 

Django's Relations Docs

注意:您可能需要获得my_moodmy_interest使用Django's QuerySet API,然后才能执行此代码的实例。

+0

,这不会将其从兴趣模型中移除? – Nayish 2011-06-13 16:23:36

+1

@nayish不,不会的。但为什么不自己尝试呢? – DrTyrsa 2011-06-13 16:27:11

+17

比django文档更好 – 2012-01-31 04:37:38

7

如果您需要删除所有M2M引用而不触及下方的对象,很容易从另一个方向:

interest.mood_set.clear() 
+0

为什么这是低调的?当然,它并没有具体解决OP的问题,但我留下了答案,因为人们正在努力消除M2M上下文中的关系,并消除了循环遍历实例的需要。我认为这是一个有用的相关提示。 – shacker 2017-08-16 18:16:21

+0

我依然爱你。不要让领带让你失望。 – 2017-09-20 21:37:54

+0

这对我来说很有用(我正要循环,不想)。感谢您发布它! – bwv549 2017-11-09 22:01:37

0

你的情况,你可以简单地疏通关系

my_mood.interests.clear() 

那么也许当你在你的序列化程序中再次创建新的关系时,你可以这样做:

interests = Interests.objects.get_or_create(name='Something') 
my_mood_obj.tags.add(tag[0]) 
my_mood_obj.save()