Jak usunąć wszystkie dane z tabeli za pomocą Django

Odpowiedzi:

139

Wewnątrz menedżera:

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
źródło
3
Ponadto, jeśli używasz metody delete_everything (), uważaj na ten błąd: code.djangoproject.com/ticket/16426
David Planella,
1
Chociaż jest to odpowiedź na pierwsze pytanie, nie odpowiada na drugie pytanie. Użyłbym 'DELETE FROM %s' % (table_name, )tego kawałka, pozostawiając stół pusty, ale nietknięty.
user3934630
93

Zgodnie z najnowszą dokumentacją prawidłową metodą wywołania byłoby:

Reporter.objects.all().delete()
Popiół
źródło
3
Tak, ale zostanie to zabite, jeśli masz wiele rekordów w tabeli. więc musiałem to zrobić tak: for x in MyTable.objects.all (). iterator (): x.delete ()
max
2
@max Należy jednak pamiętać, że przy tym deletewywoływana jest metoda instancji , podczas gdy przy deletewywołaniu QuerySetnie jest.
alxs
20

Jeśli chcesz usunąć wszystkie dane ze wszystkich tabel, możesz wypróbować polecenie python manage.py flush. Spowoduje to usunięcie wszystkich danych w tabelach, ale same tabele nadal będą istnieć.

Zobacz więcej tutaj: https://docs.djangoproject.com/en/1.8/ref/django-admin/

user2817997
źródło
19
Byłoby pomocne, gdybyś wspomniał, że usuwa również twojego superużytkownika
Aurielle Perlmann
15
Powiedział „wszystkie dane ze wszystkich twoich tabel”, co powinno wskazywać, że jest to bardzo destrukcyjna operacja.
Jordan
6

Używając powłoki,

1) Aby usunąć tabelę:

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

2) Aby usunąć wszystkie dane z tabeli:

python manage.py shell
>> from {app_name}.models import {model_name}
>> {model_name}.objects.all().delete()
Mangy 007
źródło
4

Django 1.11 usuwa wszystkie obiekty z tabeli bazy danych -

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

Zapoznaj się z oficjalną dokumentacją Django, jak podano poniżej - https://docs.djangoproject.com/en/1.11/topics/db/queries/#deleting-objects

Należy zauważyć, że metoda delete () jest jedyną metodą QuerySet, która nie jest ujawniana w samym menedżerze. Jest to mechanizm bezpieczeństwa, który zapobiega przypadkowemu zażądaniu Entry.objects.delete () i usunięciu wszystkich wpisów. Jeśli chcesz usunąć wszystkie obiekty, musisz jawnie zażądać pełnego zestawu zapytań:

Sam wypróbowałem fragment kodu widoczny poniżej w moim 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)

a wewnątrz views.pymam widok, który po prostu renderuje stronę html ...

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

zakończyło usuwanie wszystkich wpisów z - model == model_4, ale teraz widzę ekran błędu w konsoli administracyjnej, gdy próbuję stwierdzić, że wszystkie obiekty modelu_4 zostały usunięte ...

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" 

Weź pod uwagę, że - jeśli nie przejdziemy do konsoli ADMIN i nie spróbujemy zobaczyć obiektów modelu - które zostały już usunięte - aplikacja Django działa tak, jak powinna.

zrzut ekranu administratora django

Rohit Dhankar
źródło
1

Jest kilka sposobów:

Aby usunąć go bezpośrednio:

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

Aby usunąć go z instancji:

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

// nie używaj tej samej nazwy

Ashish Gupta
źródło