即使模型未更改,django仍会继续创建新的迁移

时间:2019-03-10 16:12:54

标签: django migration

以下是我的模型:

class Biovariable(models.Model):
    bioid = models.AutoField(primary_key=True, unique=True)
    name = models.CharField(max_length=200)
    description = models.CharField(max_length=2000)
    units = models.ForeignKey(unit, on_delete=models.CASCADE)
    def __str__(self):
        return self.name


class Biovariable_data(models.Model):
    biovar = models.ForeignKey(Biovariable, on_delete=models.CASCADE)
    value = models.CharField(max_length=2000)
    evdate = models.CharField(max_length=30)
    evtime = models.CharField(max_length=30)
    linkedcustomer = models.ForeignKey(customer, on_delete=models.CASCADE)
    linkeddoctor = models.ForeignKey(doctor, on_delete=models.CASCADE)
    linkedclinic = models.ForeignKey(Clinic, on_delete=models.CASCADE)
    class Meta:
        unique_together = [
            "biovar", "value", "evdate", "evtime", "linkedcustomer",
            "linkeddoctor", "linkedclinic"
        ]

每次我运行makemigrations时,django都会不断创建新的迁移,而我不明白为什么。

joel@hp:~/myappointments$ ./manage.py makemigrations
Migrations for 'appointments':
appointments/migrations/0010_auto_20190310_2138.py
    - Add field dob to customer
    - Alter field biovar on biovariable_data
joel@hp:~/myappointments$ ./manage.py migrate
Operations to perform:
Apply all migrations: admin, appointments, auth, clinic, contenttypes, sessions
Running migrations:
Applying appointments.0010_auto_20190310_2138... OK
joel@hp:~/myappointments$ ./manage.py makemigrations
Migrations for 'appointments':
appointments/migrations/0011_auto_20190310_2139.py
    - Alter field biovar on biovariable_data
joel@hp:~/myappointments$ ./manage.py makemigrations
Migrations for 'appointments':
appointments/migrations/0012_auto_20190310_2139.py
    - Alter field biovar on biovariable_data
joel@hp:~/myappointments$ ./manage.py migrate
Operations to perform:
Apply all migrations: admin, appointments, auth, clinic, contenttypes, sessions
Running migrations:
Applying appointments.0011_auto_20190310_2139... OK
Applying appointments.0012_auto_20190310_2139... OK
joel@hp:~/myappointments$ ./manage.py makemigrations
Migrations for 'appointments':
appointments/migrations/0013_auto_20190310_2140.py
    - Alter field biovar on biovariable_data
joel@hp:~/myappointments$ 

其中一个迁移文件如下所示:

# Generated by Django 2.1.3 on 2019-03-10 16:09
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
    dependencies = [
        ('appointments', '0010_auto_20190310_2138'),
    ]
    operations = [
        migrations.AlterField(
            model_name='biovariable_data',
            name='biovar',
            field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='appointments.Biovariable'),
        ),
    ]

2 个答案:

答案 0 :(得分:0)

正如评论中提到并在类似问题中记录的那样,这通常是由于模型中的某些动态变化,例如日期时间或选择集以不确定的顺序出现。

该问题还可能与较小的错字或更改有关,例如小写字符与大写字符。就我而言,我的FK的模型初始迁移的名称设置为小写字母,而不是正确的大写字母。每次我运行makemigrations时,引用模型都会获得一个alter字段。通过简单地将名称大写来修复FK模型的初始迁移文件即可解决问题:

operations = [
        migrations.CreateModel(
            name='sentence',
            fields=[
                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),

operations = [
        migrations.CreateModel(
            name='Sentence',
            fields=[
                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),

虽然不确定小写字符首先是如何进入的,但是...

但是,在每个迁移文件中查找类似的内容可能有点困难,因此,我建议您仅删除所有迁移文件,然后重新进行makemigrations,从头开始。

如果由于某种原因(例如,迁移已同步到git)而不愿这样做,则可以将迁移文件移动到临时位置,运行makemigrations,然后查看是否{{ 1}}显示原始和新的初始迁移文件中不一致的内容。如果能够找到问题,请还原原始迁移文件并在那里解决问题。

答案 1 :(得分:0)

我遇到了同样的问题,但是我的模型没有动态变化。这是在更改相关模型的名称后发生的。 (作为参考,这是我通过“注册”重命名为“注册”而得的多对多模式。)

希望提供更明确的解决方案是:

# 1 - Roll back migrations
python manage.py migrate <app_name> zero>

# 2 - Delete the migration files

# 3 - Make a new migration
python manage.py makemigrations <app_name>