在我的用户模型中,我已指定:
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)
我的问题如下:有人可以帮我创建对称关系吗?这种方法是否优秀,还是有更好的方法来实现这一目标?
答案 0 :(得分:1)
如果你的意思是:
然后覆盖unique_together
将强制执行1.自定义save()
将强制执行2.和3.
因此,在这种情况下需要两种技术。
另一种方法是使用pre_save
信号来达到同样的效果。但是覆盖save
更简单,更明确的IMH.O