2011-09-29 50 views
0

林不知道我明白多表继承的优点/目的...但它可能是我正在寻找。我正在处理餐厅。我目前的逻辑是,我有一个Company模型,可能(但并非总是)餐厅。有时候公司可以成为“母公司”,在这种情况下,Company模型与Branch模型具有一对多关系。 CompanyBranch模型都将具有公共字段,例如街道地址,联系信息。如果公司只有一个“分支”,我可以认为它是餐厅本身,所以我不需要将Branch对象附加到Company。这有意义吗?我知道我重复自己的街道地址,但它似乎是一个优雅的方式来存储数据,如果我要直接读取数据库。Django中的多表继承。我不知道我明白

林不知道是否多表继承是我需要的。我只是看不到https://docs.djangoproject.com/en/dev/topics/db/models/#multi-table-inheritance

编辑:也开放采取任何建议,如果我做错了一个更好的数据库布局。

回答

2

模型继承在一般情况下很有用,因为您执行像Company.objects.all()这样的查询来返回所有公司(包括餐馆)以及Restaurant.objects.all()仅返回餐馆公司。就像“常规”继承一样,在所有子模型(餐厅)的父级(公司)模型中包含常用字段可能会有所帮助。例如,所有公司都可能有地址字段,但只有餐馆可能有food_type字段。

我记录了几个片段的链接,实现了一个“子类化查询集”,它基本上可以让你做一个类似于Company.objects.all()的查询,并让它返回给你[<公司> <餐厅> ,<公司>,<公司>,<餐厅>]。退房的链接:

http://jazstudios.blogspot.com/2009/10/django-model-inheritance-with.html

该多表方法的缺点是,它介绍了公司父表和子餐桌之间您的查询的额外加入。

alternatieve将创建一个抽象模型。这将为公司和带冗余文件的餐厅创建一个单独的表格。在多表继承的情况下,如果我们想查找一个Restaurant实例的地址字段,我们会引用(在幕后)相关的Company模型。对于抽象继承,实际上餐厅表中会有一个地址字段。此外,使用抽象继承,我不认为你可以做Company.objects.all(),并期望它会返回作为Restaurants添加的实例,也不能使用上面链接的snippits中的子类化查询集。

希望这会有所帮助, Joe