Come rimuovere tutti i dati in una tabella utilizzando Django


Risposte:


139

All'interno di un 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
Inoltre, se sei il metodo delete_everything (), fai
David Planella

1
Sebbene questo risponda alla prima domanda, non gestisce la seconda domanda. Lo userei 'DELETE FROM %s' % (table_name, )per quel pezzo, lasciando il tavolo vuoto ma intatto.
user3934630

93

Secondo l'ultima documentazione , il metodo corretto da chiamare sarebbe:

Reporter.objects.all().delete()

3
Sì, ma questo viene ucciso se hai molti record nella tabella. quindi ho dovuto farlo come: for x in MyTable.objects.all (). iterator (): x.delete ()
max

2
@max Si noti tuttavia che con questo deleteviene chiamato il metodo dell'istanza , mentre con la deletechiamata su QuerySetnon lo è.
alxs

20

Se desideri rimuovere tutti i dati da tutte le tabelle, potresti provare il comando python manage.py flush. Ciò eliminerà tutti i dati nelle tabelle, ma le tabelle stesse continueranno a esistere.

Vedi di più qui: https://docs.djangoproject.com/en/1.8/ref/django-admin/


19
Sarebbe stato utile che tu
dicessi

15
Ha detto "tutti i dati di tutte le tue tabelle", il che dovrebbe indicare che si tratta di un'operazione molto distruttiva.
Jordan

6

Utilizzando shell,

1) Per eliminare la tabella:

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

2) Per rimuovere tutti i dati dalla tabella:

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

4

Django 1.11 elimina tutti gli oggetti da una tabella di database -

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

Fare riferimento alla documentazione ufficiale di Django qui come riportato di seguito: https://docs.djangoproject.com/en/1.11/topics/db/queries/#deleting-objects

Notare che delete () è l'unico metodo QuerySet che non è esposto su un Manager stesso. Questo è un meccanismo di sicurezza per impedirti di richiedere accidentalmente Entry.objects.delete () e di eliminare tutte le voci. Se desideri eliminare tutti gli oggetti, devi richiedere esplicitamente un set di query completo:

Io stesso ho provato lo snippet di codice visto di seguito nel mio file 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)

e all'interno del mio views.pyho una vista che rende semplicemente una pagina html ...

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

ha terminato l'eliminazione di tutte le voci da - model == model_4, ma ora vedo una schermata di errore nella Console di amministrazione quando provo a verificare che tutti gli oggetti di model_4 sono stati eliminati ...

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" 

Considera che - se non andiamo nella console ADMIN e proviamo a vedere gli oggetti del modello - che sono già stati eliminati - l'app Django funziona come previsto.

django admin screencapture


1

Ci sono un paio di modi:

Per eliminarlo direttamente:

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

Per eliminarlo da un'istanza:

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

// non usare lo stesso nome

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.