Django从ManyToMany关系中删除对象

Nay*_*ish 96 django many-to-many

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

例:

我有模特MoodsInterest.

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

我创建了一个Moods被调用的实例my_mood.在my_moods我的兴趣领域,我my_interest有意义

>>> my_mood.interests.all()
[my_interest, ...]
Run Code Online (Sandbox Code Playgroud)

如何my_interestmy_mood不删除任何模型实例的情况下删除?换句话说,如何在不影响相关模型的情况下删除关系?

DrT*_*rsa 161

my_mood.interests.remove(my_interest)
Run Code Online (Sandbox Code Playgroud)

Django的关系文件

注意:在执行此代码之前,您可能必须获取Django的QuerySet API的实例my_moodmy_interest使用它.

  • 请注意,[ManyRelatedManager.remove()](https://github.com/django/django/blob/stable/4.0.x/django/db/models/fields/lated_descriptors.py#L964)也接受对象`id` s。 (3认同)
  • `AttributeError:'RelatedManager'对象没有属性'remove' (2认同)
  • 添加另一个“条目 my_mood.interests.add(my_interest)” (2认同)

sha*_*ker 46

如果您需要删除所有M2M引用而不触及底层对象,则从另一个方向开始工作会更容易:

interest.mood_set.clear()
Run Code Online (Sandbox Code Playgroud)

  • 为什么这被否决?当然,它并没有专门解决OP的问题,但是我留下了答案,因为它对于那些致力于消除M2M上下文中的关系并且消除了遍历实例的人们特别感兴趣。我认为这是一个有用的相关提示。 (4认同)
  • 这对我很有用(我正要循环但不想循环)。感谢您发布它! (3认同)

Sab*_*i 9

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

my_mood.interests.clear()
Run Code Online (Sandbox Code Playgroud)

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

interests = Interests.objects.get_or_create(name='Something')
my_mood_obj.tags.add(tag[0])
my_mood_obj.save()
Run Code Online (Sandbox Code Playgroud)

  • 由于添加会立即影响数据库,因此您无需事后保存;) (6认同)