จะลบบันทึกในรุ่น Django ได้อย่างไร?


267

ฉันต้องการลบบันทึกเฉพาะ เช่น

delete from table_name where id = 1;

ฉันจะทำเช่นนี้ในdjango model?


16
ขอบคุณที่ถามคำถาม บางครั้ง RTFM ใช้เวลานานกว่าการค้นหาของ Google และ SO ตามที่เห็นได้จากจำนวนคำตอบการโหวตและจำนวนการดู
Freedom_Ben

8
เห็นด้วยกับ @Freedom_Ben แต่สำหรับผู้อ่านในอนาคตที่เหมือนฉ * คู่มือต่อไปนี้คือสิ่งที่คุณกำลังมองหา: docs.djangoproject.com/en/dev/topics/db/queries/...
Dinei

คำตอบ:


512

มีสองวิธี:

หากต้องการลบโดยตรง:

SomeModel.objects.filter(id=id).delete()

หากต้องการลบออกจากอินสแตนซ์:

instance = SomeModel.objects.get(id=id)
instance.delete()

50
โปรดทราบว่าคนแรกจะไม่เรียกวิธีการ. delete () ของวัตถุดังนั้นหากคุณมีรหัส 'การล้างข้อมูล' ในวิธีการนั้นจะไม่ถูกเรียก โดยทั่วไปไม่ใช่ปัญหา แต่ควรคำนึงถึง
Matthew Schinckel

8
@ Matthew Schinckel: นั่นเป็นเรื่องจริง หากคุณต้องการมีวิธีการลบที่กำหนดเองมากกว่าที่คุณควรจะใช้pre_deleteหรือpost_deleteสัญญาณแทน
Wolph

2
ฉันไม่รู้ว่าเกิดอะไรขึ้นหลังจาก DJango 1.4 แต่นี่คือการดึง PKs ทั้งหมดแล้วลบโดย PKs เหล่านั้น เช่นถ้าคุณลบโดยเขตข้อมูลโดยพลการนี่อาจช้ากว่า SQL คู่กัน ... :(
Vajk Hermecz

1
@VajkHermecz: นั่นเป็นความจริงและพฤติกรรมที่คาดหวังเนื่องจากสัญญาณลบ ระบบสัญญาณ Django ต้องติดตามการเปลี่ยนแปลงฐานข้อมูลทั้งหมดเพราะมีบางสิ่งที่เกี่ยวข้องกับมัน (เช่นเดียวกับการพลิกกลับ)
Wolph

3
คุณสามารถใช้ค่าส่งคืนของdelete()เพื่อตรวจสอบสิ่งที่คุณกำลังลบ มันกลับ tuple (1, {'yourapp.SomeModel': 1})กับจำนวนวัตถุที่ถูกลบและพจนานุกรมที่มีรายละเอียดเกี่ยวกับประเภทที่ถูกลบแล้วเช่น
mcb

37
MyModel.objects.get(pk=1).delete()

สิ่งนี้จะเพิ่มข้อยกเว้นหากวัตถุที่มีคีย์หลักที่ระบุไม่มีอยู่เพราะในตอนแรกพยายามดึงวัตถุที่ระบุ

MyModel.objects.filter(pk=1).delete()

สิ่งนี้จะไม่เกิดข้อยกเว้นหากวัตถุที่มีคีย์หลักที่ระบุไม่มีอยู่และจะสร้างแบบสอบถามโดยตรง

DELETE FROM my_models where id=1

1
พิมพ์ผิดMyModel.object.filter(pk=1).delete()ค่ะ ควรเป็น "วัตถุ"
ไนเจล

8

หากคุณต้องการลบหนึ่งอินสแตนซ์ให้เขียนรหัส

delet= Account.objects.get(id= 5)
delet.delete()

หากคุณต้องการลบอินสแตนซ์ทั้งหมดให้เขียนรหัส

delet= Account.objects.all()
delete.delete()

7

หากคุณต้องการลบหนึ่งรายการ

wishlist = Wishlist.objects.get(id = 20)
wishlist.delete()

หากคุณต้องการลบรายการทั้งหมดในรายการที่อยากได้

Wishlist.objects.all().delete()

6

Wolph ให้คำตอบที่เน้นรหัสที่ดี ขอผมวางเอกสารอย่างเป็นทางการที่นี่เพื่อการอ้างอิงของผู้คน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.