วิธีลบข้อมูลทั้งหมดในตารางโดยใช้ Django


113

ฉันมีสองคำถาม:

  1. ฉันจะลบตารางใน Django ได้อย่างไร
  2. ฉันจะลบข้อมูลทั้งหมดในตารางได้อย่างไร

นี่คือรหัสของฉันซึ่งไม่สำเร็จ:

Reporter.objects.delete()

คำตอบ:


139

ภายในผู้จัดการ:

def delete_everything(self):
    Reporter.objects.all().delete()

def drop_table(self):
    cursor = connection.cursor()
    table_name = self.model._meta.db_table
    sql = "DROP TABLE %s;" % (table_name, )
    cursor.execute(sql)

3
นอกจากนี้หากคุณเป็นเมธอด delete_everything () ระวังข้อผิดพลาดนี้: code.djangoproject.com/ticket/16426
David Planella

1
แม้ว่าสิ่งนี้จะตอบคำถามแรก แต่ก็ไม่ได้จัดการกับคำถามที่สอง ฉันจะใช้'DELETE FROM %s' % (table_name, )สำหรับบิตนั้นโดยปล่อยให้โต๊ะว่างเปล่า แต่ไม่เสียหาย
user3934630

95

ตามเอกสารล่าสุดวิธีการโทรที่ถูกต้องคือ:

Reporter.objects.all().delete()

3
ใช่ แต่สิ่งนี้จะถูกฆ่าถ้าคุณมีระเบียนจำนวนมากในตาราง ดังนั้นฉันต้องทำเช่น: สำหรับ x ใน MyTable.objects.all (). iterator (): x.delete ()
สูงสุด

2
@max โปรดทราบว่าด้วยdeleteวิธีนี้จะเรียกวิธีการของอินสแตนซ์ในขณะที่มีการdeleteเรียกใช้QuerySetมันไม่
alxs

20

python manage.py flushหากคุณต้องการที่จะลบข้อมูลทั้งหมดจากตารางของคุณทั้งหมดที่คุณอาจต้องการที่จะลองสั่ง การดำเนินการนี้จะลบข้อมูลทั้งหมดในตารางของคุณ แต่ตารางจะยังคงอยู่

ดูเพิ่มเติมที่นี่: https://docs.djangoproject.com/en/1.8/ref/django-admin/


19
จะเป็นประโยชน์สำหรับคุณที่จะพูดถึงว่ามันลบ superuser ของคุณด้วย
Aurielle Perlmann

15
เขาพูดว่า "ข้อมูลทั้งหมดจากตารางทั้งหมดของคุณ" ซึ่งน่าจะบ่งบอกว่าเป็นการดำเนินการที่ทำลายล้างมาก
จอร์แดน

6

ใช้เปลือก

1) สำหรับการลบตาราง:

python manage.py dbshell
>> DROP TABLE {app_name}_{model_name}

2) สำหรับการลบข้อมูลทั้งหมดออกจากตาราง:

python manage.py shell
>> from {app_name}.models import {model_name}
>> {model_name}.objects.all().delete()

4

Django 1.11 ลบวัตถุทั้งหมดออกจากตารางฐานข้อมูล -

Entry.objects.all().delete()  ## Entry being Model Name. 

อ้างอิงเอกสาร Django อย่างเป็นทางการที่นี่ตามที่ระบุไว้ด้านล่าง - https://docs.djangoproject.com/en/1.11/topics/db/queries/#deleting-objects

โปรดทราบว่า delete () เป็นเมธอด QuerySet เดียวที่ไม่ถูกเปิดเผยบนตัวจัดการเอง นี่เป็นกลไกความปลอดภัยเพื่อป้องกันไม่ให้คุณร้องขอ Entry.objects.delete () โดยไม่ได้ตั้งใจและลบรายการทั้งหมด หากคุณต้องการลบอ็อบเจ็กต์ทั้งหมดคุณต้องร้องขอชุดเคียวรีทั้งหมดอย่างชัดเจน:

ฉันเองลองใช้ข้อมูลโค้ดที่แสดงด้านล่างในไฟล์ somefilename.py

    # for deleting model objects
    from django.db import connection
    def del_model_4(self):
        with connection.schema_editor() as schema_editor:
            schema_editor.delete_model(model_4)

และภายในของviews.pyฉันฉันมีมุมมองที่แสดงหน้า html ...

  def data_del_4(request):
      obj = calc_2() ## 
      obj.del_model_4()
      return render(request, 'dc_dash/data_del_4.html') ## 

มันสิ้นสุดการลบรายการทั้งหมดจาก - model == model_4 แต่ตอนนี้ฉันได้เห็นหน้าจอ Error ภายในคอนโซลผู้ดูแลระบบเมื่อฉันพยายามที่จะตรวจสอบว่าวัตถุทั้งหมดของ model_4 ถูกลบไปแล้ว ...

ProgrammingError at /admin/dc_dash/model_4/
relation "dc_dash_model_4" does not exist
LINE 1: SELECT COUNT(*) AS "__count" FROM "dc_dash_model_4" 

ลองพิจารณาดูว่าหากเราไม่ไปที่คอนโซลผู้ดูแลระบบและลองดูวัตถุของโมเดลซึ่งถูกลบไปแล้วแอป Django ก็ทำงานได้ตามที่ตั้งใจไว้

django admin screencapture


1

มีสองวิธี:

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

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

ในการลบออกจากอินสแตนซ์:

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

// อย่าใช้ชื่อเดียวกัน

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