web-dev-qa-db-ja.com

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

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

例:

モデルはMoodsInterestです。

Moodには、多対多のフィールドinterestsmodels.ManyToManyField(Interest))があります。

my_moodというMoodsのインスタンスを作成します。 my_moods 's interestsフィールドにはmy_interestがあります。

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

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

90
Nayish
my_mood.interests.remove(my_interest)

Djangoの関係ドキュメント

注:このコードを実行する前に、 DjangoのQuerySet API を使用してmy_moodおよびmy_interestのインスタンスを取得する必要がある場合があります。

153
DrTyrsa

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

interest.mood_set.clear()

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

39
shacker

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

my_mood.interests.clear()

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

interests = Interests.objects.get_or_create(name='Something')
my_mood_obj.tags.add(tag[0])
my_mood_obj.save()
8
Sabyasachi