如何防止多对多类链接到相同的对象?

时间:2016-05-21 21:09:45

标签: python django django-models many-to-many

在我的用户模型中,我已指定:

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对象,它们都是相同的。在通过互联网搜索时,我发现了Django文档中有关overriding model functions的部分,所以如果我按照该方法进行搜索,结果将是:

def save(self, *args, **kwargs):
    if self.person1 == self.person2:
        return
    else:
        super().save(*args, **kwargs)

我的问题如下:有人可以帮我创建对称关系吗?这种方法是否优秀,还是有更好的方法来实现这一目标?

1 个答案:

答案 0 :(得分:1)

如果你的意思是:

  1. 你不想要欺骗性的关系
  2. 一个人不能自我介绍
  3. A和B之间的关系与B和A相同,只允许一个
  4. 然后覆盖unique_together将强制执行1.自定义save()将强制执行2.和3.

    因此,在这种情况下需要两种技术。

    另一种方法是使用pre_save信号来达到同样的效果。但是覆盖save更简单,更明确的IMH.O