很简单,我对模型进行了更改,我改变了这个:
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
的更改,并显示相同的错误。
然后我进入了迁移文件夹并手动删除了我今天进行的先前迁移,然后再次运行makemigrations
和migrate
并且它成功运行。我再次测试了两次,如果我在没有设置blank=True, null=True
属性的情况下最初向模型添加了一个字段,并运行了makemigrations
,只需修复模型就不允许我迁移,我有手动删除导致错误的先前迁移。我认为你不必这样做,请参阅here:
鼓励您自由迁移,不要担心如何迁移 你有很多;迁移代码已经过优化,可以处理数百个 在没有太大减速的时候。
我认为我在工作流程中做错了,非常感谢帮助。
答案 0 :(得分:2)
在django中,先前未运行的迁移按迁移编号的顺序运行,如迁移文件名中所示。当您尝试添加没有null=True
的新字段时,数据库会因为对于现有行期望该列的某些值而抛出错误。
现在,既然您知道无法运行此迁移,则可以使用blank=True, null=True
创建另一个迁移。但是,django仍按顺序运行迁移,再次尝试在运行第二次迁移之前运行第一次迁移。因此,在运行迁移
答案 1 :(得分:0)
好像你以前创建了类似
的模型subspecies = models.ForeignKey(Subspecies, blank=False)
或
subspecies = models.ForeignKey(Subspecies, unique = True)
然后将其删除,这会在数据库架构中导致冲突