【发布时间】:2016-09-18 23:31:13
【问题描述】:
在我的用户模型中,我指定了这个:
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)
我的问题如下:有人可以帮助我创建对称关系吗,这种方法是否好,或者有更好的方法来实现?
【问题讨论】:
-
也许你应该防止通过表单验证创建相同的朋友
-
@WenZhu 表单验证是一个不错的补充,但恕我直言,它可以/不应该取代模型级验证。
标签: python django django-models many-to-many