Django添加非可空字段(ForeignKey)

时间:2016-04-17 11:38:19

标签: django django-models foreign-keys django-migrations

我需要将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?

2 个答案:

答案 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

所以,

  1. 重新创建数据库
  2. 删除migrations
  3. 运行python3 manage.py makemigrations <project>
  4. 运行python3 manage.py migrate