我不确定我理解多表继承的优点/目的......但它可能正是我正在寻找的。我正在处理餐馆。我目前的逻辑是我有一个Company
模型很可能(但不总是)是一家餐馆。有时公司可以是“父母”公司,在这种情况下,Company
模型具有一对多的Branch
模型。 Company
和Branch
模型都有公共字段,例如街道地址,联系信息。如果公司只有一个“分支”,我可以认为它是餐厅本身,因此我不需要将Branch
对象附加到Company
。这有意义吗?我知道我重复使用街道地址[...]但如果我直接阅读数据库,它似乎是一种存储数据的优雅方式。
我不确定我是否需要多表继承。我只是看着https://docs.djangoproject.com/en/dev/topics/db/models/#multi-table-inheritance而无法绕过它。
编辑:如果我做错了,也可以对更好的数据库布局采取任何建议。
答案 0 :(得分:2)
模型继承通常很有用,因为你执行像Company.objects.all()这样的查询来返回所有公司(包括餐馆),还有Restaurant.objects.all()来返回餐馆公司。就像“常规”继承一样,在所有子模型(餐厅)的父(公司)模型中包含公共字段可能会有所帮助。例如,所有公司可能都有一个地址字段,但只有Restaurants可能有一个food_type字段。
我已经记录了一些实现“子类化查询集”的片段的链接,这些片段基本上允许您执行类似于Company.objects.all()的查询,并让它返回给您的结果,如[< Company> <餐厅>,< Company>,< Company>,<餐厅> ]。看看链接:
http://jazstudios.blogspot.com/2009/10/django-model-inheritance-with.html
这种多表方法的缺点是它在Company父表和子Restaurant表之间的查询中引入了额外的连接。
替代方案是创建一个抽象模型。这为公司和餐厅创建了一个单独的表格,其中包含冗余文件。使用多表继承,如果我们想在Restaurant实例上查找地址字段,我们将引用(在幕后)相关的Company模型。使用抽象继承,Restaurant表上实际上会有一个地址字段。另外,使用抽象继承,我认为你不能做Company.objects.all()并期望它将返回作为Restaurants添加的实例,也不能使用上面链接的snippits中的子类查询集。
希望这有帮助, 乔