我开始学习django并且已经有一个问题: 如果表具有相似的字段,哪种模型创建更好? 1)标准方式形成官方教程,如
class Place(models.Model):
name = models.CharField(max_length=50)
address = models.CharField(max_length=80)
class Restaurant(models.Model):
name = models.CharField(max_length=50)
address = models.CharField(max_length=80)
serves_hot_dogs = models.BooleanField()
serves_pizza = models.BooleanField()
如您所见,两个模型都有相同的名称和地址字段。我在https://docs.djangoproject.com/en/1.6/topics/db/models/#multi-table-inheritance中发现了Multi-table ingeritance,其工作原理如下: 2)
class Place(models.Model):
name = models.CharField(max_length=50)
address = models.CharField(max_length=80)
class Restaurant(Place):
serves_hot_dogs = models.BooleanField()
serves_pizza = models.BooleanField()
正如doc所说:Place的所有字段也将在Restaurant中提供,尽管数据将驻留在不同的数据库表中。
嗯,这两个是否存在任何主要差异?我应该使用哪一个?
答案 0 :(得分:1)
在这种情况下,我认为你应该使用继承(解决方案2)。
由于Restaurant
是特殊Place
,这意味着餐厅有字段name
和address
,此外,餐厅还有字段serves_hot_dogs
和{{1 }}
考虑到以上描述,所有解决方案都是合理的。但是,serves_pizza
是Restaurant
,Place
必须可以处理为Restaurant
。
在解决方案1中,Place
和Restaurant
是分开的,您无法将Place
作为Restaurant
处理。(仅考虑OOP)
另一方面,在solution1中,如果我保存一个地址为A的Place
,并添加一个具有相同地址的Place
。我在数据库中保存了两次相同的地址,导致冗余和不一致。
这个问题与OOP中的组合和继承的不同类似。
答案 1 :(得分:0)
是的,存在差异,您只是粘贴了文档链接,这解释了这种差异。
Restaurant
(2)中的db表包含两个额外字段(serves_hot_dogs
和serves_pizza
)和一个ForeignKey
以记录在Place
db表中。
根据您应该使用哪种型号的问题 - 最适合您的型号。我通常在类似的情况下使用多表继承。
在进入表继承之前,请参阅:https://django-model-utils.readthedocs.org/en/latest/managers.html#inheritancemanager。我在处理多表继承时使用它来限制查询的数量。