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)

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()

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/


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()

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


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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.