如何在django中为现有类添加外键

时间:2017-03-30 12:57:54

标签: django database class django-models

我有简单的乡村和城镇模型:

from django.db import models

class Country(models.Model):
    name = models.CharField(max_length=50)

class Town(models.Model):
    belongs_to = models.ForeignKey(country, on_delete=models.CASCADE)
    name = models.CharField(max_length=50)

现在,我想玩一下......我想加入大陆。我想从一开始就是正确的做法:

from django.db import models

class Continent(models.Model):
    name = models.CharField(max_length=50)

class Country(models.Model):
    belongs_to = models.ForeignKey(continent, on_delete=models.CASCADE)
    name = models.CharField(max_length=50)

class Cown(models.Model):
    belongs_to = models.ForeignKey(country, on_delete=models.CASCADE)
    name = models.CharField(max_length=50)

如果我这样做并保存文件,请将admin.py中的大陆添加到admin.site.register(大陆),从makemigrations开始...我明白了:

您正在尝试添加一个不可为空的字段'属于'没有违约的国家;我们不能这样做(数据库需要som 用来填充现有行的东西)。 请选择修复:

1。)现在提供一次性默认值(将在所有现有行上设置     使用此列的空值)2。)退出,让我添加一个     models.py

中的默认值

我被困在这里,因为我不知道该怎么办?

2 个答案:

答案 0 :(得分:4)

我认为你得到的信息非常自我解释。

您正在将belongs_to字段添加到country模型中(类应使用第一个大写字母命名,尽管如此Country),但它被声明为不可为空。也就是说,必须声明一个值。

现在,因为您已经填充了country模型的某些行(对象),Django会询问您belongs_to应该添加到这些现有行的值。

有两种解决方案:

  1. 为所有这些整数添加一个整数(将成为id模型的continent)并稍后进行更改,或者
  2. 更改为belongs_to = models.ForeignKey(continent, on_delete=models.CASCADE, null=True, blank=True),以便在migrate此字段 可以为空之后,现有行将该字段设为null
  3. 希望你明白。

答案 1 :(得分:1)

我经常为此苦苦挣扎。感谢@nik_m的回答,我可以找出(经过一些测试和失败之后)最简单的方法,即从已经有对象的模型中为没有对象的模型添加新的ForeignKey。

  1. 使该字段可为空(如nik_m在上面他的答案的第2步中所述)。
  2. 创建外部模型的(默认)对象。它将自动具有id = 1(如果还没有对象的话)。
  3. 通过将null=True, blank=True替换为default=1来更改外键字段,以将您创建的新对象与所有现有行相关联。
  4. 最后,您可以(最终)删除default=1,以强制每个新对象在创建时声明外键。