在我的用户模型中,我指定了以下内容:

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/

10-11 01:39