【问题标题】:Django add non-nullable field (ForeignKey)Django 添加不可为空的字段(ForeignKey)
【发布时间】:2016-08-09 03:06:02
【问题描述】:

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

这是我已经拥有的模型,当我尝试在 Specialization 中取消注释 ForeignKey - 出现错误。如果我删除所有迁移,并从头开始 - 不会有错误。

而且 - 我根本没有记录(干净的数据库)。

如何通过这个错误,并且不要从头开始drop\create db?

【问题讨论】:

  • 在该字段中指定blank=True。
  • @MuhammadShoaib 但每个人都说 Db 中的 null 字段 - movetone。如果我需要进一步添加字段 - 应该有很多 null。有没有其他办法?

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


【解决方案1】:

从 django 的角度来看,问题在于它必须知道如何处理 Specialization 模型的现有记录。它不知道没有这些。

如果您有一个干净的数据库,如您所说,您可以将迁移取消应用到创建相关模型的位置。假设Specialization 是在名为0003_* 的迁移中创建的,您可以调用:

> python manage.py migrate <app_name> 0002

然后您可以删除应用程序中从0003 开始的所有迁移文件。然后,makemigrations 将再次起作用。如果它是在0001创建的,你必须这样做:

> python manage.py migrate <app_name> zero

话虽如此,您在makemigrations 期间提供的默认值不会以任何方式保留(它只会在migrate 期间应用于现有记录)。因此,如果您有一个空数据库,则提供任何值(例如 1)根本不会产生任何影响。

【讨论】:

  • 我做了几乎相同的方式,除了我不知道zero,所以谢谢。但是想象一下,我从事生产工作,我能做到这一点吗?我猜不,用null 值更改字段也是不好的道具。我完全理解我没有好好考虑架构是我的错,但是,嘿,为什么没有低痛苦成本的解决方案?
  • 这里不能有低痛。想象一下,在生产中,如果您已经有记录并且添加了一个不可为空的字段,那么在某些时候您将不得不决定要为这些记录赋予什么值......
猜你喜欢
  • 1970-01-01
  • 2015-02-21
  • 2013-04-04
  • 1970-01-01
  • 2016-01-23
  • 1970-01-01
  • 2020-08-26
  • 2021-03-22
  • 1970-01-01
相关资源
最近更新 更多