我在Django应用程序中的同一个类的两个对象之间有一个OneToOne关系。是否有可能强制实现这种关系的独特性?

时间:2018-05-15 17:01:45

标签: python django database 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)

我只希望大学在这种关系的两个方向上与另一所大学有关。

例如,在数据库中,如果我选择大学A作为大学B的姐妹大学,我只希望被允许选择大学B作为大学A下的姐妹大学。但是,实际上,第二种关系没有得到强制执行。

例如:现在,在Django Admin网站下,如果我首先选择A大学作为B大学的姐妹大学,我仍然可以选择任何其他大学作为大学A姐妹大学的对象。我并不仅限于选择B大学。

是否可以在数据库级别强制执行该唯一性?有没有更好的方法来完成我想要做的事情?

2 个答案:

答案 0 :(得分:9)

我认为您需要的是使这种关系对称

您可以通过覆盖save()模型的University方法来实现此目的:

def save(self, *args, **kwargs):
    super(University, self).save()
    if self.sister_university:
        self.sister_university.sister_university = self

答案 1 :(得分:2)

我从未做过这类事情,但我认为你可以通过这种方式完成这个过程:

方法:unique_together()

您可以使用Options.unique_together并将您的university_A和university_B设置为唯一对。

unique_together = ("university_A", "university_B")

在你的models.py文件中,你应该有这样的东西(可能有一些问题,但想法就在那里):

class University(models.Model):
    ...
    university = models.ForeignKey('self', on_delete=models.CASCADE)
    sister_university = models.ForeignKey('self', on_delete=models.CASCADE)
    class Meta:
        unique_together     = (('university','sister_university'),)

你应该在那里找到宝贵的细节:https://docs.djangoproject.com/en/2.0/ref/models/options/

我从未尝试过这个命令,但似乎根据你的情况解决了你的问题。