ลบวัตถุหลายรายการใน django


108

ฉันต้องการเลือกวัตถุหลายอย่างที่จะลบออกจากฐานข้อมูลของฉันใน django โดยใช้หน้าเว็บ ไม่มีหมวดหมู่ให้เลือกเลยลบออกจากทั้งหมดแบบนั้นไม่ได้ ฉันต้องใช้แบบฟอร์มการลบของตัวเองและประมวลผลใน django หรือไม่หรือ django มีวิธีทำสิ่งนี้อยู่แล้ว? ตามที่ใช้งานในอินเทอร์เฟซผู้ดูแลระบบ

คำตอบ:


203

คุณสามารถลบ QuerySet ที่คุณต้องการได้ ตัวอย่างเช่นหากต้องการลบบล็อกโพสต์ทั้งหมดด้วยโมเดลโพสต์บางส่วน

Post.objects.all().delete()

และเพื่อลบโพสต์ใด ๆ ที่มีวันที่เผยแพร่ในอนาคต

Post.objects.filter(pub_date__gt=datetime.now()).delete()

อย่างไรก็ตามคุณต้องหาวิธี จำกัด QuerySet ให้แคบลง หากคุณต้องการเพียงแค่มุมมองที่จะลบวัตถุบางอย่างให้ดูที่มุมมองลบทั่วไปมุมมองทั่วไปลบ

แก้ไข:

ขอโทษที่เข้าใจผิด. ฉันคิดว่าคำตอบอยู่ระหว่าง ในการดำเนินการของคุณเองรวมModelFormและมุมมองทั่วไป มิฉะนั้นให้ตรวจสอบแอปของบุคคลที่สามที่มีฟังก์ชันการทำงานคล้ายกัน ในคำถามที่เกี่ยวข้องแนะนำเป็นDjango กรอง


1
คุณไม่เข้าใจคำถามนี้ผิด ฉันเข้าใจว่าฉันสามารถลบทุกอย่างได้ แต่ฉันต้องเลือกวัตถุที่จะลบด้วยแบบฟอร์มบนเว็บเพจ จากนั้นประมวลผลข้อมูลที่ส่งคืนจากแบบฟอร์มใน views.py ของฉัน จากนั้นวนซ้ำสิ่งที่ส่งคืนในรูปแบบการลบขณะที่วนลูปผ่านข้อมูล แต่ฉันอยากรู้ว่าแนวทางปฏิบัติที่ดีที่สุดสำหรับการนำสิ่งนี้ไปใช้ใน django คืออะไร
คณบดี

อ่าความผิดพลาดของฉัน! ฉันจะใช้แอปของบุคคลที่สามหรือมุมมองทั่วไปกับModelForms
Matt Luongo

7
@ ดีนลองดูที่ลบมุมมอง หรือคุณสามารถเขียนมุมมองของคุณเอง ... ฉันหมายความว่าในที่สุดคุณอาจได้รับรายชื่อ PK และเรียกลบในโมเดลของคุณ ... MyModel.objects.filter(id__in=request.POST.getlist('delete_list')).delete()และฉันแน่ใจว่าคุณต้องการบางสิ่งเพื่อให้แน่ใจว่าคนที่สุ่มไม่สามารถลบทั้งหมดได้ วัตถุในฐานข้อมูลของคุณโดยการคาดเดา PK
Yuji 'Tomita' Tomita

1
@ ดีนมันยากที่จะตอบคำถามของคุณโดยไม่ต้องทำความเข้าใจให้มากขึ้น คุณเพียงแค่ต้องสร้างแบบฟอร์มที่อนุญาตให้ผู้ใช้เลือกเกณฑ์การลบที่ถูกต้อง (ไม่ว่าจะเป็นอะไรก็ตาม - บางทีอาจเป็นช่องป้อนข้อมูลที่หนึ่งพิมพ์หมายเลข ID ... แต่อาจซับซ้อนกว่า) สร้างมุมมองที่ตอบสนองต่อสิ่งนั้น แบบฟอร์มอาจดำเนินการตรวจสอบความถูกต้อง (สิทธิ์) จากนั้นเรียกfilter(foo).delete()ใช้วิธีการนั้นในที่สุด
Yuji 'Tomita' Tomita

1
หนึ่งในเหตุผลที่ไม่ได้มาพร้อมกับกรอบงานคือคำถามของการอนุญาตให้แก้ไข / ลบและความซับซ้อนอื่น ๆ ที่ @YujiTomita กล่าวถึง หากคุณต้องการการกรองที่ซับซ้อนจริงๆให้ตรวจสอบการกรอง django และเพิ่มปุ่มลบที่เรียก QuerySet.delete () หากผู้ใช้ได้รับอนุญาต
Matt Luongo
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.