django中使用复合外键的新对象与多对多

时间:2013-08-12 23:29:42

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

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

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

我也看到人们使用像这样的复合对象的对象

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

这两种方法有更优选的方法吗?如果是这样,为什么?

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

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

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

如果您正在使用管理网站,那么第一种情况也有优势。例如,能够说出list_filter = ('toppings__price',)之类的内容可能会很棒。

总之,我认为使用ManyToManyField几乎总是一个好主意,只需在需要添加其他字段(或以其他方式自定义表格)时使中间表显式。