Opened 4 years ago

Closed 4 years ago

Last modified 4 years ago

#23121 closed Bug (fixed)

Infinte migrations when changing Meta options

Reported by: JockeTF Owned by: nobody
Component: Migrations Version: 1.7-rc-2
Severity: Release blocker Keywords:
Cc: Triage Stage: Accepted
Has patch: no Needs documentation: no
Needs tests: no Patch needs improvement: no
Easy pickings: no UI/UX: no

Description

Changing a model's meta options sometimes causes Django to generate an infinite number of migrations.

Create a model with meta options.

from django.db import models

class Pony(models.Model):
    date_created = models.DateTimeField()

    class Meta():
        ordering = ('-date_created',)

Make migrations.

$ python3 manage.py makemigrations
Migrations for 'infinite':
  0001_initial.py:
    - Create model Pony

Remove the meta options from the model.

from django.db import models

class Pony(models.Model):
    date_created = models.DateTimeField()

Make migrations.

$ python3 manage.py makemigrations
Migrations for 'infinite':
  0002_auto_20140728_1440.py:
    - Change Meta options on pony

$ python3 manage.py makemigrations
Migrations for 'infinite':
  0003_auto_20140728_1440.py:
    - Change Meta options on pony

$ python3 manage.py makemigrations
Migrations for 'infinite':
  0004_auto_20140728_1440.py:
    - Change Meta options on pony

I first encountered this issue when upgrading from Django 1.7b4 to 1.7c1. I do not know what exactly is causing this, but it happens in more cases than just when removing the meta options. In my project I have many migrations scripts for several different models. Two of the models ended up suffering from this issue after upgrading to Django 1.7c1. The issue is still present in Django 1.7c2. Squashing the migrations does not help. However, removing the migrations and starting anew solves the issue.

Below is an example of a squashed migration which suffers from this issue.

from django.db import models, migrations

class Migration(migrations.Migration):

    replaces = [('infinite', '0001_initial'), ('infinite', '0002_auto_20140728_1440')]

    dependencies = [
    ]

    operations = [
        migrations.CreateModel(
            name='Pony',
            fields=[
                ('id', models.AutoField(serialize=False, auto_created=True, primary_key=True, verbose_name='ID')),
                ('date_created', models.DateTimeField()),
            ],
            options={
                'ordering': ('-date_created',),
            },
            bases=(models.Model,),
        ),
        migrations.AlterModelOptions(
            name='pony',
            options={},
        ),
    ]

Starting from scratch solves the issue.

from django.db import models, migrations

class Migration(migrations.Migration):

    dependencies = [
    ]

    operations = [
        migrations.CreateModel(
            name='Pony',
            fields=[
                ('id', models.AutoField(primary_key=True, serialize=False, auto_created=True, verbose_name='ID')),
                ('date_created', models.DateTimeField()),
            ],
            options={
            },
            bases=(models.Model,),
        ),
    ]

Change History (4)

comment:1 Changed 4 years ago by Tim Graham

Severity: NormalRelease blocker
Triage Stage: UnreviewedAccepted

I can reproduce.

comment:2 Changed 4 years ago by Andrew Godwin <andrew@…>

Resolution: fixed
Status: newclosed

In d6e73a876d77e889efe839345d39690a7004e2f4:

Fixed #23121: AlterModelOptions operation not changing state right

comment:3 Changed 4 years ago by Andrew Godwin <andrew@…>

In 394053ce605a30c742d6270a80986b255adb3a30:

[1.7.x] Fixed #23121: AlterModelOptions operation not changing state right

comment:4 Changed 4 years ago by JockeTF

Thank you! I can confirm that this solves the issue.

Note: See TracTickets for help on using tickets.
Back to Top