Comment supprimer toutes les données d'une table à l'aide de Django

113

J'ai deux questions:

  1. Comment supprimer une table dans Django?
  2. Comment supprimer toutes les données du tableau?

Voici mon code, qui ne réussit pas:

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

Réponses:

139

À l'intérieur d'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)
Tiago
la source
3
Aussi, si vous utilisez la méthode delete_everything (), méfiez-vous de ce bogue: code.djangoproject.com/ticket/16426
David Planella
1
Bien que cela réponde à la première question, il ne traite pas la deuxième question. J'utiliserais 'DELETE FROM %s' % (table_name, )pour cela, laissant la table vide mais intacte.
user3934630
93

Selon la dernière documentation , la méthode correcte à appeler serait:

Reporter.objects.all().delete()
Cendre
la source
3
Oui, mais cela est tué si vous avez de nombreux enregistrements dans la table. donc je devais le faire comme: for x in MyTable.objects.all (). iterator (): x.delete ()
max
2
@max Notez cependant qu'avec ceci, la deleteméthode de l'instance est appelée, alors qu'avec l' deleteappel sur QuerySetelle ne l'est pas.
alxs
20

Si vous souhaitez supprimer toutes les données de toutes vos tables, vous pouvez essayer la commande python manage.py flush. Cela supprimera toutes les données de vos tables, mais les tables elles-mêmes existeront toujours.

En savoir plus ici: https://docs.djangoproject.com/en/1.8/ref/django-admin/

user2817997
la source
19
Il vous aurait été utile de mentionner qu'il supprime également votre super
Aurielle Perlmann
15
Il a dit "toutes les données de toutes vos tables", ce qui devrait indiquer que c'est une opération très destructrice.
Jordanie
6

En utilisant shell,

1) Pour supprimer le tableau:

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

2) Pour supprimer toutes les données du tableau:

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

Django 1.11 supprime tous les objets d'une table de base de données -

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

Reportez-vous à la documentation officielle de Django ici comme cité ci-dessous - https://docs.djangoproject.com/en/1.11/topics/db/queries/#deleting-objects

Notez que delete () est la seule méthode QuerySet qui n'est pas exposée sur un Manager lui-même. Il s'agit d'un mécanisme de sécurité pour vous empêcher de demander accidentellement Entry.objects.delete () et de supprimer toutes les entrées. Si vous souhaitez supprimer tous les objets, vous devez demander explicitement un jeu de requêtes complet:

J'ai moi-même essayé l'extrait de code ci-dessous dans mon 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)

et dans mon views.pyj'ai une vue qui rend simplement une page html ...

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

il a fini de supprimer toutes les entrées de - model == model_4, mais maintenant je peux voir un écran d'erreur dans la console d'administration lorsque j'essaye de vérifier que tous les objets de model_4 ont été supprimés ...

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" 

Considérez que - si nous n'allons pas dans la console ADMIN et essayons de voir les objets du modèle - qui ont déjà été supprimés - l'application Django fonctionne comme prévu.

Capture d'écran de l'administrateur django

Rohit Dhankar
la source
1

Il y a plusieurs façons:

Pour le supprimer directement:

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

Pour le supprimer d'une instance:

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

// n'utilise pas le même nom

Ashish Gupta
la source