我已经看到模型中明确表达的多对多关系如:
class Pizza(models.Model):
toppings = models.ManyToManyField(Topping, blank=True, null=True)
我也看到人们使用像这样的复合对象的对象
class PizzaTopping(models.Model):
pizza = models.ForeignKey(Pizza)
topping = models.ForeignKey(Topping)
这两种方法有更优选的方法吗?如果是这样,为什么?
答案 0 :(得分:2)
如果您的中间表中有其他字段(示例中没有),则使用第二个示例。当你不这样做时,第一个例子就足够了。
答案 1 :(得分:0)
第一种情况的优点是Pizza.toppings
是一种方便的方式来访问披萨的所有配料。在第二种情况下,你必须说Topping.objects.filter(pizzatopping_set__pizza=pizza)
之类的东西,这很尴尬。
如果您需要中间表(PizzaTopping
)上的额外数据,则必须明确定义表。但是,仍然由您决定是否将ManyToMany字段添加到Pizza
(使用through
关键字),这又取决于您是否希望方便地访问Pizza.toppings
。
如果您正在使用管理网站,那么第一种情况也有优势。例如,能够说出list_filter = ('toppings__price',)
之类的内容可能会很棒。
总之,我认为使用ManyToManyField几乎总是一个好主意,只需在需要添加其他字段(或以其他方式自定义表格)时使中间表显式。