How to remove an app from a django projects (and all its tables)
First: Remove references in the code
- remove
app_to_remove
fromsettings.INSTALLED_APPS
- remove other references in
urls.py
or other places
Second: Clean the database
Create an empty migration for your django-project:
manage.py makemigrations your_django_project --empty
Edit the file. Here is a template:
# -*- coding: utf-8 -*-from __future__ import unicode_literalsfrom django.db import migrations, modelsclass Migration(migrations.Migration): dependencies = [ ('your_django_project', '0001_initial'), ] operations = [ migrations.RunSQL(''' drop table if exists app_to_remove_table1; drop table if exists app_to_remove_table2; .... delete from auth_permission where content_type_id in (select id from django_content_type where app_label = '{app_label}'); delete from django_admin_log where content_type_id in (select id from django_content_type where app_label = '{app_label}'); delete from django_content_type where app_label = '{app_label}'; delete from django_migrations where app='{app_label}'; '''.format(app_label='app_to_remove')) ]
Run the migration, run tests.
About "drop if exists": You have two cases:
- The production system: You want to drop the tables.
- New development systems: These systems never had this app, and they don't have this table :-)
Note: this guide is successful with Django 3.1.1 and Python 3.8.2
Can you try this solution to clean your database and migrations first
Step 1: Delete your table from the file your_app/models.py but leave the file itself
Step 2: Check your register in the file admin.py if you have
Step 3: create migration:
manage.py makemigrations your_app
Step 4: migrate into database:
manage.py migrate
you can see the result in my example
Step 5: delete all the files in the folder your_app/migrations
Step 6: Remove migrations in the table django_migrations
python manage.py migrate --fake your_app zero
Check migrations:
python manage.py showmigrations