Django 从多对多关系中删除对象
Posted
技术标签:
【中文标题】Django 从多对多关系中删除对象【英文标题】:Django removing object from ManyToMany relationship 【发布时间】:2011-09-14 01:17:35 【问题描述】:如何在不删除实际对象的情况下从多对多关系中删除对象?
示例:
我有模型Moods
和Interest
。
Mood
有一个多对多字段interests
(即models.ManyToManyField(Interest)
)。
我创建了一个名为my_mood
的Moods
实例。在my_moods
的兴趣领域我有my_interest
,意思是
>>> my_mood.interests.all()
[my_interest, ...]
如何在不删除任一模型实例的情况下从 my_mood
中删除 my_interest
?换句话说,如何在不影响相关模型的情况下删除关系?
【问题讨论】:
【参考方案1】:model.field.remove(object_you_want_to_remove)
在这种情况下使用:my_mood.interests.remove(my_interest)
【讨论】:
【参考方案2】:my_mood.interests.remove(my_interest)
Django's Relations Docs
注意:您可能必须先使用Django's QuerySet API 获取my_mood
和my_interest
的实例,然后才能执行此代码。
【讨论】:
AttributeError: 'RelatedManager' object has no attribute 'remove'
添加另一个entry my_mood.interests.add(my_interest)
@Cerin:(很抱歉碰到旧评论)问题是关于 m2m,这意味着 ManyRelatedManager
,而不是 RelatedManager
。这解释了AttributeError
。
注意ManyRelatedManager.remove()也接受对象id
s。【参考方案3】:
如果您需要在不触及底层对象的情况下删除所有 M2M 引用,那么从另一个方向工作会更容易:
interest.mood_set.clear()
虽然这不能直接解决 OP 的问题,但在这种情况下通常很有用。
【讨论】:
为什么这被否决了?当然,它并没有具体解决 OP 的问题,但我留下了答案,因为它对那些努力消除 M2M 上下文中的关系的人特别感兴趣,并且不需要循环遍历实例。我认为这是一个有用的相关提示。 这对我很有用(我正要循环但不想)。感谢发布! 如果你在上面的答案中添加这一点可能会更好 或者在models和interest.relatedname.clear()
有相关名称【参考方案4】:
在你的情况下,你可以简单地清除关系
my_mood.interests.clear()
那么,当您再次在序列化程序中创建新关系时,您可以执行类似的操作
interests = Interests.objects.get_or_create(name='Something')
my_mood_obj.tags.add(tag[0])
my_mood_obj.save()
【讨论】:
由于add会立即影响数据库,所以以后不需要保存;)以上是关于Django 从多对多关系中删除对象的主要内容,如果未能解决你的问题,请参考以下文章