Como remover todos os dados de uma tabela usando Django

113

Eu tenho duas perguntas:

  1. Como excluo uma tabela no Django?
  2. Como faço para remover todos os dados da tabela?

Este é o meu código, que não obteve sucesso:

Reporter.objects.delete()
zjm1126
fonte
Da CLI: stackoverflow.com/questions/6485106/…
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

Respostas:

139

Dentro de um gerente:

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
fonte
3
Além disso, se você for o método delete_everything (), cuidado com este bug: code.djangoproject.com/ticket/16426
David Planella
1
Embora isso responda à primeira pergunta, não lida com a segunda pergunta. Eu usaria 'DELETE FROM %s' % (table_name, )para aquela parte, deixando a mesa vazia, mas intacta.
user3934630
93

De acordo com a documentação mais recente , o método correto para chamar seria:

Reporter.objects.all().delete()
Cinza
fonte
3
Sim, mas isso é eliminado se você tiver muitos registros na tabela. então eu tive que fazer assim: for x em MyTable.objects.all (). iterator (): x.delete ()
máx.
2
@max Observe, entretanto, que com isso, o deletemétodo da instância é chamado, enquanto com a deletechamada no QuerySetnão é.
Alxs
20

Se você deseja remover todos os dados de todas as suas tabelas, você pode tentar o comando python manage.py flush. Isso excluirá todos os dados de suas tabelas, mas as próprias tabelas ainda existirão.

Veja mais aqui: https://docs.djangoproject.com/en/1.8/ref/django-admin/

user2817997
fonte
19
Teria sido útil se você mencionasse que isso também remove seu superusuário
Aurielle Perlmann
15
Ele disse "todos os dados de todas as suas tabelas", o que deve indicar que é uma operação muito destrutiva.
Jordan,
6

Usando shell,

1) Para excluir a tabela:

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

2) Para remover todos os dados da tabela:

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

Django 1.11 deleta todos os objetos de uma tabela de banco de dados -

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

Consulte a documentação oficial do Django aqui conforme citado abaixo - https://docs.djangoproject.com/en/1.11/topics/db/queries/#deleting-objects

Observe que delete () é o único método QuerySet que não é exposto no próprio Manager. Este é um mecanismo de segurança para evitar que você acidentalmente solicite Entry.objects.delete () e exclua todas as entradas. Se você quiser excluir todos os objetos, precisará solicitar explicitamente um conjunto de consulta completo:

Eu mesmo tentei o snippet de código visto abaixo em meu 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 dentro do meu views.pyeu tenho uma visão que simplesmente renderiza uma página html ...

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

acabou excluindo todas as entradas de - model == model_4, mas agora vejo uma tela de erro no console de administração quando tento verificar se todos os objetos de model_4 foram excluídos ...

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" 

Considere que - se não formos ao console de ADMIN e tentarmos ver os objetos do modelo - que já foram excluídos - o aplicativo Django funcionará exatamente como pretendido.

django admin screencapture

Rohit Dhankar
fonte
1

Existem algumas maneiras:

Para excluí-lo diretamente:

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

Para excluí-lo de uma instância:

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

// não use o mesmo nome

Ashish Gupta
fonte