Django:与= =单独模型的多对多关系

时间:2014-01-04 08:10:03

标签: django django-models django-orm

我只是想知道为什么你需要使用通过的多对多关系,如果你只是可以使用一个单独的模型?

例如:

class Test(models.Model):
    name = models.CharField(max_length=100)
    description = models.TextField()

class Indicator(models.Model):
    name = models.CharField(max_length=100)
    target_value = models.IntegerField()

class TestResult(models.Model):
    test = models.ForeignKey(Test)
    indicator = models.ForeignKey(Indicator)
    actual_value = models.IntegerField()
    timestamp = models.DateTimeField(auto_now_add=True)

为什么要定义多对多关系?感谢

1 个答案:

答案 0 :(得分:6)

您应该添加ManyToMany属性有三个原因:

首先使用此属性,您将明确声明多对多的relstion,从而正确建模您的域对象。这非常重要,因为任何看到你的模型的人都会理解这些关系 - 如果你没有ManyToMany属性,那么读者就会对你打算做什么感到困惑。毕竟,django哲学的一个中心点是“明确胜过隐性”!在您的情况下,您应该将一个指示符= ManyToMany('Indicator',through ='TestIndicator')属性添加到Test模型。

此外,ManyToMany属性将帮助您创建涉及相关模型的查询,而无需使用中间对象。例如,您可以获得具有特定指标名称的所有测试(我知道这也可以通过ForeignKey完成,但显式优于隐式)

最后,将ManyToMany属性添加到其中一个模型,您可以创建内联管理表单以轻松编辑关系。例如,在您的情况下,您可以在TestAdmin中添加内联,通过该内联,您可以向此测试添加指标。