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


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)

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

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/


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

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


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

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.