如何使用不能为空的圆形外键创建模型实例

时间:2019-07-12 18:45:16

标签: django foreign-keys django-2.2

在我的django应用程序中,我有两个一对多关系的模型:TermTermNameTerm有很多TermName)。我想跟踪特定Term实例的TermName,说TermName模型是名称别名或相关的Term模型,但是其中之一是“引用”名称别名。为此,我在两个模型之间添加了一对一的关系。这是代码:

class TermName(models.Model):
    name = models.CharField(max_length=255)
    term = models.ForeignKey(
        'Term', 
        on_delete=models.CASCADE
    )

class Term(models.Model):
    ref_termname = models.OneToOneField(
        TermName, 
        on_delete=models.DO_NOTHING,
        related_name = 'reference_of_term',
    )

问题是如果我创建一个新的Term实例,django抱怨ref_termname不能为null。但是,如果我想事先创建“引用” TermName,情况也会一样;现在它抱怨term为空...

我的解决方法是让ref_termname为空(即使用null=True字段选项)。但是对于我的模型设计,我想使其不为空。可以吗?

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

如果将OneToOneField移至TermName模型怎么办?我认为您可以按以下方式建模:

class TermName(models.Model):
    name = models.CharField(max_length=255)
    term = models.ForeignKey(
        'Term', 
        on_delete=models.CASCADE
    )
    reference_of_term = models.OneToOneField(
        TermName, 
        on_delete=models.PROTECT,
        related_name = 'ref_termname',
    )

class Term(models.Model):
    pass

现在,您应该能够首先创建Term的实例,然后创建指向TermName的{​​{1}}。唯一的缺点是Term不会被迫拥有Term