1

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

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

我还看到人们使用带有这样的复合对象的对象

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

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

4

2 回答 2

2

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

于 2013-08-13T00:14:35.533 回答
0

第一种情况的优点是Pizza.toppings可以方便地访问披萨的所有配料。在第二种情况下,您必须说类似 的话Topping.objects.filter(pizzatopping_set__pizza=pizza),这很尴尬。

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

如果您使用的是管理站点,则第一种情况也有优势。例如,能够说诸如list_filter = ('toppings__price',).

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

于 2013-08-13T00:33:14.847 回答