在我的用户模型中,我指定了以下内容:
friends = models.ManyToManyField(
'self',
blank=True,
symmetrical=False,
through='Relationship')
这是我正在使用的课程:
class Relationship(models.Model):
person1 = models.ForeignKey(
User,
on_delete=models.CASCADE,
related_name="person1")
person2 = models.ForeignKey(
User,
on_delete=models.CASCADE,
related_name="person2")
is_active = models.BooleanField(default=False)
class Meta:
unique_together = (('person1', 'person2'),)
使用
unique_together
我试图使多对多关系成为单向关系,即,如果具有指定键的同一个对象以相反的顺序存在,则防止创建多对多对象,但是不会这样做工作。而且似乎这种关系不是对称的,因为如果我将该属性设置为true,则会给我一个错误,该错误表明使用自定义类是不可能的。我还想做一件事-阻止使用相同的外键创建m2m对象。在Internet上搜索时,我发现了Django文档中有关overriding model functions的部分,因此,如果采用这种方法,结果将是:
def save(self, *args, **kwargs):
if self.person1 == self.person2:
return
else:
super().save(*args, **kwargs)
我的问题是:有人可以帮助我建立对称关系吗?这种方法是否很好,或者有更好的方法可以实现?
最佳答案
如果您的意思是:
你不想被骗的关系
一个人不能引用自己
A和B之间的关系与B和A相同,并且只应允许一个
然后,覆盖unique_together
将强制执行1。自定义save()
将强制执行2和3。
因此,在这种情况下需要两种技术。
另一种选择是使用pre_save
信号达到相同的效果。但是覆盖save
是更简单,更明确的IMH.O
关于python - 如何防止多对多类链接到相同的对象?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/37368052/