【问题标题】:Multi-Table Inheritance in Django. I'm not sure I understandDjango 中的多表继承。我不确定我是否理解
【发布时间】:2011-09-29 05:47:05
【问题描述】:
我不确定我是否了解多表继承的优势/目的……但这可能是我正在寻找的。我与餐馆打交道。我目前的逻辑是我有一个Company 模型,它可能(但不总是)是一家餐厅。有时,公司可以是“母公司”,在这种情况下,Company 模型与Branch 模型具有一对多的关系。 Company 和 Branch 模型都有公共字段,例如街道地址、联系信息。如果公司只有一个“分支”,我可以假设它是餐厅本身,所以我不需要将Branch 对象附加到Company。这有意义吗?我知道我用街道地址重复自己 [...] 但如果我要直接读取数据库,这似乎是一种存储数据的优雅方式。
我不确定多表继承是否是我需要的。光是看https://docs.djangoproject.com/en/dev/topics/db/models/#multi-table-inheritance,我就无法理解它。
编辑:如果我做错了,也愿意接受关于更好的数据库布局的任何建议。
【问题讨论】:
标签:
django
django-models
multiple-inheritance
【解决方案1】:
模型继承通常很有用,因为您可以执行诸如 Company.objects.all() 之类的查询来返回所有公司(包括餐馆),还可以使用 Restaurant.objects.all() 来仅返回餐馆公司。就像“常规”继承一样,在所有子模型(餐厅)中包含父(公司)模型中的公共字段可能会有所帮助。例如,所有公司可能都有地址字段,但只有餐厅可能有 food_type 字段。
我已经记录了一些实现“子类化查询集”的 sn-ps 的链接,它基本上可以让您执行类似 Company.objects.all() 的查询并让它返回给您类似 [、、、]。查看链接:
http://jazstudios.blogspot.com/2009/10/django-model-inheritance-with.html
这种多表方法的缺点是它在 Company 父表和 Restaurant 子表之间的查询中引入了额外的连接。
另一种方法是创建一个抽象模型。这会为公司和餐厅创建一个带有冗余文件的单独表。对于多表继承,如果我们想在 Restaurant 实例上查找地址字段,我们将引用(在幕后)相关的 Company 模型。使用抽象继承,Restaurant 表上实际上会有一个地址字段。此外,使用抽象继承,我认为您不能执行 Company.objects.all() 并期望它会返回作为餐厅添加的实例,也不能使用上面链接的片段中的子类化查询集。
希望这会有所帮助,
乔