繁体   English   中英

Django无向唯一在一起

[英]Django undirected unique-together

我想对集合中所有成员之间的成对关系建模。

class Match(models.Model):

    foo_a = models.ForeignKey(Foo, related_name='foo_a')
    foo_b = models.ForeignKey(Foo, related_name='foo_b')

    relation_value = models.IntegerField(default=0)

    class Meta:
        unique_together = ('ingredient_a', 'ingredient_b')

当我添加一对AB时,它成功阻止我再次添加AB,但是并不能阻止我添加BA。

我尝试跟随,但无济于事。

unique_together = (('ingredient_a', 'ingredient_b'), ('ingredient_b', 'ingredient_a'))

编辑:我需要为每对项目都唯一的relationship_value

如果您按照定义的方式定义模型,则不仅是外键,还称为ManyToMany Relation。

在Django文档中,明确定义了对于ManyToMany Relation不能包括唯一的共同约束。

从文档中

ManyToManyField不能包含在unique_together中。 (尚不清楚这意味着什么!)如果您需要验证与ManyToManyField相关的唯一性,请尝试使用信号或显式直通模型。

编辑

经过大量搜索和反复试验后,我终于找到了针对您的方案的解决方案。 是的,正如您所说,目前的架构并不像我们所有人认为的那么琐碎。 在这种情况下,多对多关系不是我们需要转发的讨论。 解决方案是(或我认为解决方案是) 模型清洁方法

class Match(models.Model):
    foo_a = models.ForeignKey(Foo, related_name='foo_a')
    foo_b = models.ForeignKey(Foo, related_name='foo_b')

    def clean(self):
        a_to_b = Foo.objects.filter(foo_a = self.foo_a, foo_b = self.foo_b)
        b_to_a = Foo.objects.filter(foo_a = self.foo_b, foo_b = self.foo_a) 

        if a_to_b.exists() or b_to_a.exists():
            raise ValidationError({'Exception':'Error_Message')})

有关模型清理方法的更多详细信息,请参阅此处文档...

我重写了对象的save方法,每次都保存2对。 如果用户要添加一对AB,则会自动添加具有相同参数的记录BA。

注意: 此解决方案会影响查询速度。 对于我的项目,这不是问题,但是需要考虑。

 def save(self, *args, **kwargs): if not Match.objects.filter(foo_a=self.foo_a, foo_b=self.foo_b).exists(): super(Match, self).save(*args, **kwargs) if not Match.objects.filter(foo_a=self.foo_b, foo_b=self.foo_a).exists(): Match.objects.create(foo_a=self.foo_b, foo_b=self.foo_a, bar=self.bar) 

编辑:当然,更新和删除方法也需要被覆盖。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM