Django ลบวัตถุออกจากความสัมพันธ์ ManyToMany


112

ฉันจะลบวัตถุออกจากความสัมพันธ์แบบกลุ่มต่อกลุ่มโดยไม่ลบวัตถุจริงได้อย่างไร

ตัวอย่าง:

ฉันมีแบบจำลองMoodsและInterest.

Moodมีฟิลด์แบบกลุ่มต่อกลุ่มinterests(ซึ่งเป็นกmodels.ManyToManyField(Interest))

ฉันจะสร้างตัวอย่างของที่เรียกว่าMoods my_moodในmy_moodsสาขาความสนใจของฉันมีmy_interestความหมาย

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

ฉันจะลบวิธีmy_interestจากmy_moodโดยไม่ต้องลบเช่นรูปแบบการอย่างใดอย่างหนึ่ง? กล่าวอีกนัยหนึ่งฉันจะลบความสัมพันธ์โดยไม่ส่งผลกระทบต่อโมเดลที่เกี่ยวข้องได้อย่างไร

คำตอบ:


183
my_mood.interests.remove(my_interest)

เอกสารความสัมพันธ์ของ Django

หมายเหตุ: คุณอาจต้องได้รับอินสแตนซ์my_moodและmy_interestใช้QuerySet API ของ Djangoก่อนจึงจะสามารถรันโค้ดนี้ได้


3
AttributeError: 'RelatedManager' object has no attribute 'remove'
Cerin

1
เพิ่มอีกentry my_mood.interests.add(my_interest)
Zohab Ali

65

หากคุณต้องการลบการอ้างอิง M2M ทั้งหมดโดยไม่ต้องสัมผัสวัตถุที่อยู่ข้างใต้การทำงานจากทิศทางอื่นจะง่ายกว่า:

interest.mood_set.clear()

แม้ว่าจะไม่ได้ตอบคำถามของ OP โดยตรง แต่ก็มักจะมีประโยชน์ในสถานการณ์นี้


10
เหตุใดจึงถูกลดลง จริงอยู่ที่มันไม่ได้ระบุเฉพาะคำถามของ OP แต่ฉันทิ้งคำตอบไว้เพราะเป็นที่สนใจของผู้คนที่ต่อสู้กับการลบความสัมพันธ์ในบริบท M2M และขจัดความจำเป็นในการวนซ้ำผ่านอินสแตนซ์ ฉันคิดว่ามันเป็นเคล็ดลับที่เป็นประโยชน์
shacker

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.