Django Python Web Framework
June 2, 2026 3 min read

How to Remove Existing Model and Migrations in Django

Hs
Hemant singh
Technical Writer & Educator

Follow these steps to safely remove a model and its migrations:

1. Open Model and Remove the Code

  1. Open models.py of the corresponding app.
  2. Delete the class definition of the model you want to remove.

2. Create a New Migration

python manage.py makemigrations

3. Apply the Migration

python manage.py migrate

CRUD Operations in Django

Create

User.objects.create(username="john", email="john@example.com")

Read

users = User.objects.all()

Update

user = User.objects.get(id=1)
user.email = "newemail@example.com"
user.save()

Delete

User.objects.get(id=1).delete()

Bulk Delete

User.objects.filter(age__lt=18).delete()

Using Django Query Filters

AND Condition

# WHERE age > 18 AND city = 'Delhi'
User.objects.filter(age__gt=18, city='Delhi')

OR Condition

from django.db.models import Q

# WHERE age > 18 OR city = 'Delhi'
User.objects.filter(Q(age__gt=18) | Q(city='Delhi'))

NOT Condition

# WHERE NOT city = 'Delhi'
User.objects.exclude(city='Delhi')

# OR using Q object
User.objects.filter(~Q(city='Delhi'))

Filter (WHERE Clauses)

# WHERE username = 'john'
User.objects.filter(username='john')

# WHERE age > 18
User.objects.filter(age__gt=18)

# WHERE age >= 18
User.objects.filter(age__gte=18)

# WHERE age < 18
User.objects.filter(age__lt=18)

# WHERE age <= 18
User.objects.filter(age__lte=18)

# WHERE age != 18
User.objects.exclude(age=18)

# WHERE name LIKE '%john%' (case-insensitive)
User.objects.filter(name__icontains='john')

# WHERE name LIKE 'John%' (starts with)
User.objects.filter(name__istartswith='John')

# WHERE name LIKE '%John' (ends with)
User.objects.filter(name__iendswith='John')

Django Model Relationships

class Vendor(models.Model):
    name = models.CharField(max_length=100)

class Brand(models.Model):
    name = models.CharField(max_length=100)

class Product(models.Model):
    name = models.CharField(max_length=100)
    price = models.DecimalField(max_digits=10, decimal_places=2)

    category = models.ForeignKey(Category, on_delete=models.CASCADE, related_name='products')
    brand = models.ForeignKey(Brand, on_delete=models.SET_NULL, null=True)
    vendor = models.ForeignKey(Vendor, on_delete=models.SET_NULL, null=True)
    tags = models.ManyToManyField(Tag)

Using PROTECT to Prevent Deletion

category = models.ForeignKey(Category, on_delete=models.PROTECT, related_name='products')
brand = models.ForeignKey(Brand, on_delete=models.PROTECT, null=True)
vendor = models.ForeignKey(Vendor, on_delete=models.PROTECT, null=True)

Note:

If you do not pass the related_name parameter, Django will use the default reverse relation name in the format: modelname_set. For example, brand.product_set.all().