DjangoがManyToMany関係からオブジェクトを削除する


112

実際のオブジェクトを削除せずに、多対多の関係からオブジェクトを削除するにはどうすればよいですか?

例:

私はモデルを持っているMoodsInterest

Mood多対多フィールドinterests(これはmodels.ManyToManyField(Interest))があります。

私はのインスタンスの作成Moodsと呼ばれるがmy_mood。でmy_moods、私が持っているの利益のフィールドmy_interest、意味

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

どちらのモデルインスタンスも削除せずにmy_interestからmy_mood削除するにはどうすればよいですか?つまり、関連モデルに影響を与えずに関係を削除するにはどうすればよいですか?

回答:



65

基になるオブジェクトに触れずにすべてのM2M参照を削除する必要がある場合は、反対方向から作業する方が簡単です。

interest.mood_set.clear()

これはOPの質問に直接対処するものではありませんが、この状況ではしばしば役立ちます。


10
なぜこれは反対票が投じられたのですか?OPの質問には特に触れていませんが、M2Mコンテキストでの関係の削除に取り組む人々にとって特に興味があり、インスタンスをループする必要がなくなるため、回答は残しました。役立つ関連ヒントだと思いました。
シャッカー2017

2
これは私にとって便利でした(ループするところだったので、したくありませんでした)。投稿してくれてありがとう!
bwv549

1
上記の回答にこのポイントを追加するだけでよいかもしれません
brainLoop

1
または、モデルに関連する名前を付けてinterest.relatedname.clear()
Josh

11

あなたの場合、あなたは単に関係をクリアすることができます

my_mood.interests.clear()

次に、シリアライザで新しいリレーションを再度作成しているときに、次のようなことができます

interests = Interests.objects.get_or_create(name='Something')
my_mood_obj.tags.add(tag[0])
my_mood_obj.save()
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.