Django 从多对多关系中删除对象

Posted

技术标签:

【中文标题】Django 从多对多关系中删除对象【英文标题】:Django removing object from ManyToMany relationship 【发布时间】:2011-09-14 01:17:35 【问题描述】:

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

示例:

我有模型MoodsInterest

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

我创建了一个名为my_moodMoods 实例。在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_moodmy_interest 的实例,然后才能执行此代码。

【讨论】:

AttributeError: 'RelatedManager' object has no attribute 'remove' 添加另一个entry my_mood.interests.add(my_interest) @Cerin:(很抱歉碰到旧评论)问题是关于 m2m,这意味着 ManyRelatedManager,而不是 RelatedManager。这解释了AttributeError 注意ManyRelatedManager.remove()也接受对象ids。【参考方案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 从多对多关系中删除对象的主要内容,如果未能解决你的问题,请参考以下文章

从多对多关系中获取核心数据

从多对多关系中获取结果

使用实体框架从多对多关系中选择数据

从多对多关系中获取数据

如何从多对多关系中只加载 1 个结果 Laravel

Hibernate - 从多对多关系访问字段