簡體   English   中英

我在Django應用程序中的同一個類的兩個對象之間有一個OneToOne關系。 是否有可能強制實現這種關系的獨特性?

[英]I have a OneToOne relationship between two objects of the same class in a Django app. Is it possible to enforce the uniqueness of this relationship?

我的應用程序中有以下內容:

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.

是否可以在數據庫級別強制執行該唯一性? 有沒有更好的方法來完成我想要做的事情?

我認為你需要的是使這種關系對稱

您可以通過覆蓋University模型的save()方法來完成此任務:

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

我從來沒有做過這種事情,但我認為你可以通過這種方式完成這個過程:

方法: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/

我從未嘗試過這個命令,但它似乎根據你的上下文解決了你的問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM