今天早上我在我的系统上复制了两次这个奇怪的问题。使用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.
我觉得我在我的工作流程中做错了什么,我们非常感谢您的帮助。在
在django语言中,以前没有运行过的迁移,按迁移号的顺序运行,如迁移文件名中所示。当您尝试添加不带
null=True
的新字段时,数据库会抛出一个错误,因为它希望该列的现有行有一些值。在既然您知道这个迁移不能运行,那么就用
blank=True, null=True
创建另一个迁移。但是,django仍然按顺序运行迁移,再次尝试在运行第二个迁移之前运行第一个迁移。因此,在运行migrate之前,您必须删除错误的迁移好像你以前创造了一个模型
或者
^{pr2}$然后删除它,这会导致数据库模式中的冲突
相关问题 更多 >
编程相关推荐