2

所以我在我的 Django 项目中有一个模型(为了参数,称为“应用程序”),例如;

class ModelA(models.Model):
    fieldA = models.IntegerField(default=0)

我可以运行 python manage.py makemigrations 应用程序;这给了我

Migrations for 'app':
  app/migrations/0001_initial.py
    - Create model ModelA

如果我然后向 ModelA 添加一个新字段,它看起来像;

class ModelA(models.Model):
    fieldA = models.IntegerField(default=0),
    fieldB = models.IntegerField(default=1)

然后再次运行 makemigrations ,我明白了;

Migrations for 'app':
  app/migrations/0002_auto_20170529_1737.py
    - Remove field fieldA from modela
    - Add field fieldB to modela

自动生成的文件支持这一点;

operations = [
        migrations.RemoveField(
            model_name='modela',
            name='fieldA',
        ),
        migrations.AddField(
            model_name='modela',
            name='fieldB',
            field=models.IntegerField(default=1),
        ),
    ]

为什么要删除fieldA?

我的理解是它应该只对模型进行脚本更改,即添加了那个 fieldB。

4

2 回答 2

10

问题是您在添加fielda时添加了一个逗号fieldb

fieldA = models.IntegerField(default=0),

您应该删除逗号并删除0002迁移。然后,当你重新运行时makemigrations,Django 将不再尝试删除fielda.

于 2017-05-29T17:51:56.383 回答
2

我没有看到包含您的字段的整个类,但如果存在与您的字段同名的 @property 方法,则似乎可以从迁移过程中省略或删除一个字段。因此,下面的代码将从数据库中删除 fieldA

class ModelA(models.Model):
    fieldA = models.IntegerField(default=0)

    @property
    def fieldA(self):
        pass

你应该重命名你的字段或你的方法:

class ModelA(models.Model):
    _fieldA = models.IntegerField(default=0)

    @property
    def fieldA(self):
        pass 
于 2018-11-09T15:01:16.867 回答