【问题标题】:Multi-Table Inheritance in Django. I'm not sure I understandDjango 中的多表继承。我不确定我是否理解
【发布时间】:2011-09-29 05:47:05
【问题描述】:

我不确定我是否了解多表继承的优势/目的……但这可能是我正在寻找的。我与餐馆打交道。我目前的逻辑是我有一个Company 模型,它可能(但不总是)是一家餐厅。有时,公司可以是“母公司”,在这种情况下,Company 模型与Branch 模型具有一对多的关系。 CompanyBranch 模型都有公共字段,例如街道地址、联系信息。如果公司只有一个“分支”,我可以假设它是餐厅本身,所以我不需要将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() 并期望它会返回作为餐厅添加的实例,也不能使用上面链接的片段中的子类化查询集。

    希望这会有所帮助, 乔

    【讨论】:

      猜你喜欢
      • 2013-01-16
      • 2012-03-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-30
      • 1970-01-01
      • 2020-04-14
      • 1970-01-01
      相关资源
      最近更新 更多