【问题标题】:Django removing object from ManyToMany relationshipDjango 从多对多关系中删除对象
【发布时间】: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?换句话说,如何在不影响相关模型的情况下删除关系?

【问题讨论】:

    标签: django many-to-many


    【解决方案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会立即影响数据库,所以以后不需要保存;)
      猜你喜欢
      • 2015-08-22
      • 1970-01-01
      • 2021-09-04
      • 1970-01-01
      • 2023-03-08
      • 2021-10-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多