在Django中,对于同一类的两个对象之间的OneToOne关系,是否可以阻止对象在db级别引用自身?

时间:2018-05-15 20:12:29

标签: python sql django database-design django-models

我的应用程序中有以下内容:

class University(models.Model):
    ...
    sister_university = models.OneToOneField('self', 
                        related_name = 
                        'university_sister_university', 
                        blank=True, null=True, 
                        on_delete=models.SET_NULL)

实际上,在Django Admin网站下,我可以选择A大学作为A大学的姐妹大学(本身)。是否有可能在数据库级别强制实施某种规则,以便大学对象永远不会成为自己的姐妹大学?

或者,是否有更好的方法来完成我想要做的事情?

2 个答案:

答案 0 :(得分:0)

您想要的是check约束,例如:

alter table university
add constraint chk_non_self_ref check (id <> sister_university_id);

我不知道在Django模型中定义此方法的方法(但我猜你可以将它添加到迁移中)。

答案 1 :(得分:0)

在模型级别,您可以覆盖模型的clean()方法,以便在每次保存University实例时实施该检查。

def clean(self):

    if self.sister_university.id == self.id:
        raise ValidationError('A university object can never be its own sister_university.')