Django 1错误的迁移扰乱了数据模型

2024-09-27 21:34:24 发布

您现在位置:Python中文网/ 问答频道 /正文

今天早上我在我的系统上复制了两次这个奇怪的问题。使用django 1.9.2。在

很简单,我改变了一个模型,我改变了这个:

class Sighting(models.Model):
        caption = models.CharField(max_length=100,default=None)
        subspecies = models.ForeignKey(Subspecies, default=None, blank=True)
        lat = models.FloatField(default=None)
        lng = models.FloatField(default= None)
        #location = models.CharField(max_length=100, default=None, null=True, blank=True)
        sighting_date = models.DateTimeField()
        image = models.ImageField(default=None)
        user_id = models.IntegerField(default=None)

        def __str__(self):
                return self.caption

为此:

^{pr2}$

我将species_tags字段添加到模型中。我成功地运行了makemigrations,然后试图migrate我得到了这个错误:

django.db.utils.IntegrityError: NOT NULL constraint failed: birds_sighting.species_tags

因此,我将模型改为这样,在新字段中添加blank=True, null=True

class Sighting(models.Model):
        caption = models.CharField(max_length=100,default=None)
        subspecies = models.ForeignKey(Subspecies, default=None, blank=True)
        species_tags = models.CharField(max_length=100,default=None, blank=True, null=True)
        lat = models.FloatField(default=None)
        lng = models.FloatField(default= None)
        #location = models.CharField(max_length=100, default=None, null=True, blank=True)
        sighting_date = models.DateTimeField()
        image = models.ImageField(default=None)
        user_id = models.IntegerField(default=None)

        def __str__(self):
                return self.caption

我再次运行makemigrations,它反映了一个变化,然后migrate再次显示了相同的错误。在

然后我进入migrations文件夹,手动删除我今天所做的迁移,然后再次运行makemigrations和{},它成功地工作了。我再次测试了两次,每次都是这样的,如果我最初在没有blank=True, null=True属性集的情况下向模型中添加一个字段,然后运行一个makemigrations,只是简单地修复了不允许我迁移的模型,我必须手动删除导致错误的以前的迁移。我不认为你必须这么做,看here

You are encouraged to make migrations freely and not worry about how many you have; the migration code is optimized to deal with hundreds at a time without much slowdown.

我觉得我在我的工作流程中做错了什么,我们非常感谢您的帮助。在


Tags: 模型selfnonetruedefaultmodelsnulllength
2条回答

在django语言中,以前没有运行过的迁移,按迁移号的顺序运行,如迁移文件名中所示。当您尝试添加不带null=True的新字段时,数据库会抛出一个错误,因为它希望该列的现有行有一些值。在

既然您知道这个迁移不能运行,那么就用blank=True, null=True创建另一个迁移。但是,django仍然按顺序运行迁移,再次尝试在运行第二个迁移之前运行第一个迁移。因此,在运行migrate之前,您必须删除错误的迁移

好像你以前创造了一个模型

subspecies = models.ForeignKey(Subspecies, blank=False)

或者

^{pr2}$

然后删除它,这会导致数据库模式中的冲突

相关问题 更多 >

    热门问题