So entfernen Sie alle Daten in einer Tabelle mit Django

113

Ich habe zwei Fragen:

  1. Wie lösche ich eine Tabelle in Django?
  2. Wie entferne ich alle Daten in der Tabelle?

Dies ist mein Code, der nicht erfolgreich ist:

Reporter.objects.delete()
zjm1126
quelle
Von der CLI: stackoverflow.com/questions/6485106/…
Ciro Santilli 13 冠状 病 六四 事件 13

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)
Tiago
quelle
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()
Asche
quelle
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/

user2817997
quelle
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()
Mangy 007
quelle
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

Rohit Dhankar
quelle
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

Ashish Gupta
quelle