【问题标题】: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 几乎总是一个好主意,仅当您需要添加其他字段(或以其他方式自定义表)时才使中间表显式。