180

I have two questions:

  1. How do I delete a table in Django?
  2. How do I remove all the data in the table?

This is my code, which is not successful:

Reporter.objects.delete()
daaawx
  • 3,273
  • 2
  • 17
  • 16
zjm1126
  • 34,604
  • 53
  • 121
  • 166

10 Answers10

213

Inside a 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
  • 9,457
  • 5
  • 39
  • 35
  • 7
    Also, if you're the delete_everything() method, beware of this bug: https://code.djangoproject.com/ticket/16426 – David Planella Feb 19 '12 at 10:52
  • 1
    While this answers the first question, it doesn't handle the second question. I would use `'DELETE FROM %s' % (table_name, )` for that bit, leaving the table empty but intact. – user3934630 Aug 07 '15 at 21:43
143

As per the latest documentation, the correct method to call would be:

Reporter.objects.all().delete()
Arnaud P
  • 12,022
  • 7
  • 56
  • 67
Ash
  • 1,614
  • 1
  • 10
  • 6
  • 9
    Yes but this gets killed if you have many records in the table. so I had to do it like: for x in MyTable.objects.all().iterator(): x.delete() – max Sep 27 '17 at 15:13
  • 2
    @max Note however that with this, the instance's `delete` method is called, while with the `delete` call on the `QuerySet` it isn't. – alekosot Jun 19 '18 at 12:30
52

If you want to remove all the data from all your tables, you might want to try the command python manage.py flush. This will delete all of the data in your tables, but the tables themselves will still exist.

See more here: https://docs.djangoproject.com/en/1.8/ref/django-admin/

umop aplsdn
  • 300
  • 1
  • 12
user2817997
  • 589
  • 4
  • 4
39

Using shell,

1) For Deleting the table:

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

2) For removing all data from table:

python manage.py shell
>> from {app_name}.models import {model_name}
>> {model_name}.objects.all().delete()
Kumar Mangalam
  • 748
  • 7
  • 12
  • 1
    option 1) needs a closing semicolon `>> DROP TABLE {app_name}_{model_name};`, also helpful to use `>> .tables` before to check names of tables. – Matthias Arras Dec 14 '21 at 21:15
6

Django 1.11 delete all objects from a database table -

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

Refer the Official Django documentation here as quoted below - https://docs.djangoproject.com/en/1.11/topics/db/queries/#deleting-objects

Note that delete() is the only QuerySet method that is not exposed on a Manager itself. This is a safety mechanism to prevent you from accidentally requesting Entry.objects.delete(), and deleting all the entries. If you do want to delete all the objects, then you have to explicitly request a complete query set:

I myself tried the code snippet seen below within my 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)

and within my views.py i have a view that simply renders a html page ...

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

it ended deleting all entries from - model == model_4 , but now i get to see a Error screen within Admin console when i try to asceratin that all objects of model_4 have been deleted ...

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" 

Do consider that - if we do not go to the ADMIN Console and try and see objects of the model - which have been already deleted - the Django app works just as intended.

django admin screencapture

Rohit Dhankar
  • 1,574
  • 18
  • 25
5

Use this syntax to delete the rows also to redirect to the homepage (To avoid page load errors) :

def delete_all(self):
  Reporter.objects.all().delete()
  return HttpResponseRedirect('/')
3

You can use the Django-Truncate library to delete all data of a table without destroying the table structure.

Example:

  1. First, install django-turncate using your terminal/command line:
pip install django-truncate
  1. Add "django_truncate" to your INSTALLED_APPS in the settings.py file:
INSTALLED_APPS = [
    ...
    'django_truncate',
]
  1. Use this command in your terminal to delete all data of the table from the app.
python manage.py truncate --apps app_name --models table_name
Rishit Dagli
  • 1,000
  • 8
  • 20
Mahbub Ul Islam
  • 773
  • 8
  • 15
  • My google search showed me `python manage.py truncate --apps app_name --models table_name.` and I excitedly clicked to give you an upvote them saw this... super disappointing. Gave you n upvote anyway though – Chris Maggiulli Jul 16 '22 at 19:21
2

There are a couple of ways:

To delete it directly:

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

To delete it from an instance:

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

// don't use same name

Ashish Gupta
  • 1,153
  • 12
  • 14
1

I know the question is for a long time ago, but just for the record, because this saved me:

python manage.py flush

The above will delete all the data on your database (PostgreSQL in my case). Even the superuser.

If you want to delete all the rows of a specific table, then:

python manage.py shell
>> from app.models import SomeTable
>> SomeTable.objects.all().delete()
Mohawo
  • 47
  • 7
-4

Actually, I un-register the model (the table data that I want to delete) from the admin.py. Then I migrate.

python manage.py makemigrations
python manage.py migrate
python runserver

Then I register the model in the admin.py and do migration again. :) Now, the table is empty. This might not be a professional answer, but it helped me.

May
  • 1