【问题标题】:Django: Many-to-Many Relationship with through= vs. separate ModelDjango:通过=与单独模型的多对多关系
【发布时间】:2014-01-22 00:06:26
【问题描述】:

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

例如:

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)

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

【问题讨论】:

    标签: django django-models django-orm


    【解决方案1】:

    出于三个原因,您应该添加 ManyToMany 属性:

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

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

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

    【讨论】:

      猜你喜欢
      • 2013-07-04
      • 2023-04-10
      • 2016-04-18
      • 2015-02-15
      • 2019-05-09
      • 2012-07-28
      • 1970-01-01
      • 2014-05-16
      • 1970-01-01
      相关资源
      最近更新 更多