Django menghapus objek dari hubungan ManyToMany

112

Bagaimana cara menghapus objek dari hubungan Banyak-ke-Banyak tanpa menghapus objek sebenarnya?

Contoh:

Saya memiliki model Moodsdan Interest.

Moodmemiliki bidang banyak-ke-banyak interests(yaitu a models.ManyToManyField(Interest)).

Saya membuat contoh yang Moodsdisebut my_mood. Dalam my_moodsbidang kepentingan yang saya miliki my_interest, makna

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

Bagaimana cara menghapus my_interestdari my_moodtanpa menghapus salah satu contoh model? Dengan kata lain, bagaimana cara menghapus hubungan tanpa memengaruhi model terkait?

Nachshon Schwartz
sumber

Jawaban:

183
my_mood.interests.remove(my_interest)

Hubungan Django Docs

Catatan: Anda mungkin harus mendapatkan turunan dari my_mooddan my_interestmenggunakan QuerySet API Django sebelum Anda dapat menjalankan kode ini.

DrTyrsa
sumber
3
AttributeError: 'RelatedManager' object has no attribute 'remove'
Cerin
1
untuk menambahkan yang lainentry my_mood.interests.add(my_interest)
Zohab Ali
65

Jika Anda perlu menghapus semua referensi M2M tanpa menyentuh objek yang mendasarinya, akan lebih mudah untuk bekerja dari arah lain:

interest.mood_set.clear()

Meskipun ini tidak secara langsung menjawab pertanyaan OP, namun seringkali berguna dalam situasi ini.

shacker
sumber
10
Mengapa ini tidak disukai? Memang itu tidak secara khusus membahas pertanyaan OP, tetapi saya meninggalkan jawabannya karena ini adalah minat khusus bagi orang-orang yang bergulat dengan penghapusan hubungan dalam konteks M2M, dan menghilangkan kebutuhan untuk mengulang melalui contoh. Saya pikir itu adalah tip terkait yang bermanfaat.
shacker
2
Ini hanya berguna bagi saya (saya akan mengulang dan tidak mau). Terima kasih telah mempostingnya!
bwv549
1
akan lebih baik jika Anda menambahkan poin ini pada jawaban di atas
brainLoop
1
Atau dengan nama terkait di model daninterest.relatedname.clear()
Josh
11

Dalam kasus Anda, Anda cukup menghapus hubungan tersebut

my_mood.interests.clear()

Kemudian mungkin ketika Anda kembali membuat relasi baru di serializer Anda, Anda dapat melakukan sesuatu seperti ini

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