【问题标题】:Make Migrations on Django在 Django 上进行迁移
【发布时间】:2020-06-14 01:06:16
【问题描述】:

我有一个看起来像这样的 Django 模型

class RedUsers(BaseModel):
    user_email = models.EmailField(null=True, blank=True)
    user_name = models.CharField(max_length=30, null=True, blank=True)
    red_id = models.CharField(max_length=30, null=True, blank=True)
    active = models.BooleanField(default=False)

    def __str__(self):
        return self.user_email

    class Meta:
        verbose_name_plural = "Red Users"

我想添加一个新字段

activation_key = models.CharField(max_length=40, null=True, blank=True)

这个模型我已经有很多数据了,不能drop table,所以需要手动迁移。

我尝试从我的 0001_initial.py 文件中添加模型,但没有成功

class Migration(migrations.Migration): 
    initial = True

    dependencies = [] 

    operations = [ 
        migrations.CreateModel(
            name='RedUsers',
            fields=[
                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
                ('created', models.DateTimeField(auto_now_add=True)),
                ('modified', models.DateTimeField(auto_now=True)),
                ('user_email', models.EmailField(blank=True, max_length=254, null=True)),
                ('user_name', models.CharField(blank=True, max_length=30, null=True)),
                ('red_id', models.CharField(blank=True, max_length=30, null=True)),
                ('active', models.BooleanField(default=False)),
            ],
            options={
                'verbose_name_plural': 'RED Users',
            },
        ),
         migrations.AddField(
            model_name='redusers',
            name='activation_key',
            field=models.CharField(blank=True, max_length=40, null=True, verbose_name='activation key'),
        ),
    ] 

当我跑步时 python manage.py migrate

它说您的模型具有尚未反映在迁移中的更改,因此不会应用。

我不知道还能做什么

【问题讨论】:

  • 好吧,因为您可能已经迁移了。 Django 将该迁移文件的名称添加到表中,因此它认为迁移已完全完成。我认为最好简单地删除AddField,然后运行makemigrations。它将创建一个具有另一个迁移名称的第二个文件。

标签: python django postgresql orm


【解决方案1】:

我想添加一个新字段

activation_key = models.CharField(max_length=40, null=True, blank=True)

我已经在这个模型中有很多数据,我不能删除表格, 所以我需要手动迁移。

你不需要。如果你再次运行makemigrations,Django 会检测到你添加了一个字段,并会制作一个额外的迁移文件来将该字段添加到模型中。

因此,您最好从迁移文件中删除 AddField 迁移对象,然后运行 ​​python3 manage.py makemigrations

它将创建一个新文件,可能以0002_….py 开头,并将第一次迁移作为依赖项。

然后可以运行python3 manage.pymigrate,Django会在数据库级别添加字段,并在迁移表中插入迁移的名称。

【讨论】:

  • @zaddyn00b:是的,您首先需要从原始迁移中删除AddField。如果你添加它,当你运行makemigrations 时,Django 会认为它已经被之前的迁移添加了。请不要开始编辑自动构建的迁移。
  • 我把它拿出来了,我在 python 2 上运行 Django==1.11.10,但我认为这不是问题
  • @zaddyn00b:您是否删除了*.pyc 文件(已编译的二进制文件)?
猜你喜欢
  • 2021-06-27
  • 2014-11-13
  • 2018-07-27
  • 2021-10-13
  • 2022-12-01
  • 2015-11-05
  • 2022-01-09
  • 2020-05-09
  • 1970-01-01
相关资源
最近更新 更多