我在 Django 应用程序中同一类的两个对象之间有一个一对一的关系.是否有可能强制执行这种关系的唯一性?



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

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的sister_university,我只想被允许选择大学B作为大学A下的sister_university。但是,实际上,第二种关系并未强制执行。

例如:现在,在 Django 管理站点下,如果我首先选择大学 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/

我从未尝试过此命令,但它似乎可以根据您的上下文解决您的问题。

相关内容

  • 没有找到相关文章

最新更新