![](/img/trans.png)
[英]In Django, for a OneToOne relationship between two objects of the same class, can an object be prevented from referring to itself at the db level?
[英]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
我從來沒有做過這種事情,但我認為你可以通過這種方式完成這個過程:
您可以使用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.