Mohammad Hossein Gerami
Mohammad Hossein Gerami

Reputation: 1388

Django makemigration generates AlterField without any change on Model

When using makemigrations in Django, I notice that it generates migrations even for fields that did not changed. What is the reason for this?

Here is the Model that Django generates a new migration for every time I run makemigrations

class Announcement(OJModel):
    owner = models.ForeignKey(
        "user.User",
        verbose_name=_("Announcement Owner"),
        on_delete=models.CASCADE,
        related_name="owner_announcements",
        null=True,
        blank=True,
    )
    title = models.CharField(max_length=300, default="", verbose_name=_("Title"))
    description = models.TextField(
        max_length=3000, default="", verbose_name=_("Description")
    )
    estate = models.OneToOneField(
        "announcement.Estate",
        on_delete=models.CASCADE,
        verbose_name=_("Estate"),
        null=True,
    )

Script generated by makemigrations:

class Migration(migrations.Migration):
    dependencies = [
        ("announcement", "0072_auto_20181218_1256"),
    ]

    operations = [
        migrations.AlterField(
            model_name="announcement",
            name="estate",
            field=models.OneToOneField(
                null=True,
                on_delete=django.db.models.deletion.CASCADE,
                to="announcement.Estate",
                verbose_name="Estate",
            ),
        ),
    ]

Upvotes: 1

Views: 849

Answers (1)

Novfensec
Novfensec

Reputation: 116

Write like this in models.py:

from django.db import models

class Announcement(models.Model):
    owner = models.ForeignKey('user.User', verbose_name=_('Announcement Owner'), on_delete=models.CASCADE,related_name='owner_announcements', null=True, blank=True)
    title = models.CharField(max_length=300, default='', verbose_name=_('Title'))
    description = models.TextField(max_length=3000, default='',verbose_name=_('Description'))
    estate = models.OneToOneField('announcement.Estate', on_delete=models.CASCADE,verbose_name=_('Estate'), null=True)

    def __str__(self):
        return self.title

In admin.py write like this:

from django.contrib import admin
from .models import Announcement

# Register your models here.

admin.site.register(Announcement)

Save the files and now delete the old migration from migration folder!

Now run these in the command line in manage.py directory:

python manage.py makemigrations

Then this:

python manage.py migrate

It's all done!

Upvotes: 1

Related Questions