【问题标题】:many to many vs new object with compound foreign keys in djangodjango中具有复合外键的多对多vs新对象
【发布时间】:2013-08-12 23:29:42
【问题描述】:

我已经看到模型中明确表达的多对多关系,例如:

class Pizza(models.Model):
    toppings = models.ManyToManyField(Topping, blank=True, null=True)

我还看到人们将对象与这样的复合对象一起使用

class PizzaTopping(models.Model):
    pizza = models.ForeignKey(Pizza)
    topping = models.ForeignKey(Topping)

这两种方法中是否有更可取的方法?如果有,为什么?

【问题讨论】:

    标签: django django-models many-to-many


    【解决方案1】:

    当您的中间表中有其他字段(该示例没有)时,使用第二个示例。当您不这样做时,第一个示例就足够了。

    【讨论】:

      【解决方案2】:

      第一种情况的优点是Pizza.toppings 是访问披萨所有配料的便捷方式。在第二种情况下,你必须说Topping.objects.filter(pizzatopping_set__pizza=pizza)之类的东西,这很尴尬。

      如果您需要中间表 (PizzaTopping) 上的额外数据,则必须明确定义该表。不过,是否将 ManyToMany 字段添加到 Pizza(带有 through 关键字)仍然取决于您,这又取决于您是否想要方便地访问 Pizza.toppings

      如果您使用的是管理站点,则第一种情况也有优势。例如,能够说出list_filter = ('toppings__price',) 之类的内容会很好。

      总而言之,我想说使用 ManyToManyField 几乎总是一个好主意,仅当您需要添加其他字段(或以其他方式自定义表)时才使中间表显式。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-03-06
        • 2012-03-24
        • 2018-05-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-02-17
        相关资源
        最近更新 更多