So entfernen Sie alle Daten in einer Tabelle mit Django


Antworten:


139

In einem Manager:

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
Wenn Sie die Methode delete_everything () sind, achten Sie auf diesen Fehler: code.djangoproject.com/ticket/16426
David Planella

1
Während dies die erste Frage beantwortet, wird die zweite Frage nicht behandelt. Ich würde 'DELETE FROM %s' % (table_name, )für dieses Bit verwenden und die Tabelle leer, aber intakt lassen.
user3934630

93

Gemäß der neuesten Dokumentation wäre die richtige Methode zum Aufrufen:

Reporter.objects.all().delete()

3
Ja, aber dies wird getötet, wenn Sie viele Datensätze in der Tabelle haben. Also musste ich es so machen: für x in MyTable.objects.all (). iterator (): x.delete ()
max

2
@max Beachten Sie jedoch, dass damit die deleteMethode der Instanz aufgerufen wird, während dies beim deleteAufruf der Instanz nicht der Fall QuerySetist.
Alxs

19

Wenn Sie alle Daten aus all Ihren Tabellen entfernen möchten, können Sie den Befehl versuchen python manage.py flush. Dadurch werden alle Daten in Ihren Tabellen gelöscht, die Tabellen selbst sind jedoch weiterhin vorhanden.

Weitere Informationen finden Sie hier: https://docs.djangoproject.com/de/1.8/ref/django-admin/


19
Wäre hilfreich für Sie gewesen zu erwähnen, dass es auch Ihren Superuser entfernt
Aurielle Perlmann

15
Er sagte "alle Daten aus all Ihren Tabellen", was darauf hinweisen sollte, dass es sich um eine sehr destruktive Operation handelt.
Jordan

5

Mit Shell,

1) Zum Löschen der Tabelle:

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

2) Zum Entfernen aller Daten aus der Tabelle:

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

4

Django 1.11 löscht alle Objekte aus einer Datenbanktabelle -

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

Lesen Sie hier die offizielle Django-Dokumentation, wie unten angegeben - https://docs.djangoproject.com/de/1.11/topics/db/queries/#deleting-objects

Beachten Sie, dass delete () die einzige QuerySet-Methode ist, die in einem Manager selbst nicht verfügbar gemacht wird. Dies ist ein Sicherheitsmechanismus, der verhindert, dass Sie versehentlich Entry.objects.delete () anfordern und alle Einträge löschen. Wenn Sie alle Objekte löschen möchten, müssen Sie explizit einen vollständigen Abfragesatz anfordern:

Ich selbst habe das unten gezeigte Code-Snippet in meinem ausprobiert 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)

und innerhalb meiner habe views.pyich eine Ansicht, die einfach eine HTML-Seite rendert ...

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

Es löschte alle Einträge aus - model == model_4, aber jetzt wird ein Fehlerbildschirm in der Admin-Konsole angezeigt, wenn ich versuche festzustellen, dass alle Objekte von model_4 gelöscht wurden ...

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" 

Bedenken Sie, dass die Django-App wie vorgesehen funktioniert, wenn wir nicht zur ADMIN-Konsole gehen und versuchen, bereits gelöschte Objekte des Modells anzuzeigen.

django admin screencapture


1

Es gibt verschiedene Möglichkeiten:

So löschen Sie es direkt:

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

So löschen Sie es aus einer Instanz:

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

// benutze nicht den gleichen Namen

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.