我需要将ForeignKey
字段添加到模型中,但makemigrations
会返回错误以设置默认值。但我没有赢得任何默认值。
例如
@python_2_unicode_compatible
class Doctor(models.Model):
name = models.CharField(max_length=250)
surname = models.CharField(max_length=250)
middlename = models.CharField(max_length=250)
city = models.CharField(max_length=250)
specialization = models.ForeignKey('Specialization', blank=True)
def __str__(self):
return "%s %s" % (self.name, self.surname)
@python_2_unicode_compatible
class Specialization(models.Model):
name = models.CharField(max_length=250)
#spec_table_name = models.ForeignKey('SpecializationTable')
def __str__(self):
return self.name
class Consultation(models.Model):
client_id = models.ForeignKey('Client')
doctor_id = models.ForeignKey('Doctor')
#how to dropdown from doctor
#record_id = models.ForeignKey(Specialization)
@python_2_unicode_compatible
class SpecializationTable(models.Model):
name = models.CharField(max_length=250)
def __str__(self):
return self.name
class SpecializationTableRow(models.Model):
row_name = models.CharField(max_length=250)
row_description = models.CharField(max_length=999)
row_required = models.BooleanField()
table_name = models.ForeignKey(SpecializationTable)
当我尝试在ForeignKey
中取消注释Specialization
时,这就是我已有的模型 - 错误上诉。如果我删除所有迁移,并从头开始 - 就不会有错误。
而且 - 我根本没有记录(干净的数据库)。
如何传递此错误,并且不要从头开始删除\ create db?
答案 0 :(得分:0)
django的观点是,它必须知道如何处理Specialization
模型的现有记录。它无法知道其中没有任何一个。
如果您有一个干净的数据库,正如您所说,您可以将迁移取消应用到创建相关模型的位置。假设Specialization
是在名为0003_*
的迁移中创建的,您可以调用:
> python manage.py migrate <app_name> 0002
然后,您可以从0003
开始删除应用中的所有迁移文件。然后,makemigrations
将再次起作用。如果它是在0001
中创建的,则必须执行以下操作:
> python manage.py migrate <app_name> zero
这就是说,您在makemigrations
期间提供的默认值不会以任何方式保留(它只会在migrate
期间应用于现有记录)。因此,如果您有一个空数据库,提供任何值(例如1
)都不会产生任何影响。
答案 1 :(得分:0)
对我有用的一个简单的“n”脏修复是删除并重新创建数据库,然后删除 migrations
目录并再次运行 python3 manage.py makemigrations <project>
和 python3 manage.py migrate
。
所以,
migrations
python3 manage.py makemigrations <project>
python3 manage.py migrate