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

时间:2016-06-14 10:26:33

标签: python django database datamodel

这里奇怪的问题是我今天早上在我的系统上复制了两次。使用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

到此:

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)
        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

我将species_tags字段添加到模型中。我成功运行makemigrations,然后尝试migrate我收到了此错误:

  

django.db.utils.IntegrityError:NOT NULL约束失败:   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的更改,并显示相同的错误。

然后我进入了迁移文件夹并手动删除了我今天进行的先前迁移,然后再次运行makemigrationsmigrate并且它成功运行。我再次测试了两次,如果我在没有设置blank=True, null=True属性的情况下最初向模型添加了一个字段,并运行了makemigrations,只需修复模型就不允许我迁移,我有手动删除导致错误的先前迁移。我认为你不必这样做,请参阅here

  

鼓励您自由迁移,不要担心如何迁移   你有很多;迁移代码已经过优化,可以处理数百个   在没有太大减速的时候。

我认为我在工作流程中做错了,非常感谢帮助。

2 个答案:

答案 0 :(得分:2)

在django中,先前未运行的迁移按迁移编号的顺序运行,如迁移文件名中所示。当您尝试添加没有null=True的新字段时,数据库会因为对于现有行期望该列的某些值而抛出错误。

现在,既然您知道无法运行此迁移,则可以使用blank=True, null=True创建另一个迁移。但是,django仍按顺序运行迁移,再次尝试在运行第二次迁移之前运行第一次迁移。因此,在运行迁移

之前,您始终必须删除错误的迁移

答案 1 :(得分:0)

好像你以前创建了类似

的模型
subspecies = models.ForeignKey(Subspecies, blank=False)

subspecies = models.ForeignKey(Subspecies, unique = True)

然后将其删除,这会在数据库架构中导致冲突