我开始学习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中发现了一个工作方式如下的多表ingerince: (二)
^{pr2}$正如doc所说:所有Place字段也将在Restaurant中可用,尽管数据将驻留在不同的数据库表中。在
嗯,这两者之间有什么主要区别吗?我该用哪一个呢?在
在这种情况下,我认为您应该使用继承(解决方案2)。在
因为},另外,餐厅有{}和{}。在
Restaurant
是一个特殊的Place
,意味着餐厅有name
和{综上所述,所有的解决方案都是合理的。但是,
Restaurant
是Place
,Restaurant
必须作为Place
处理。 在解决方案1中,Restaurant
和Place
是分开的,不能将Restaurant
作为Place
来处理(只考虑OOP)另一方面,在解决方案1中,如果我用地址a保存一个
Place
,然后添加一个具有相同地址的Restaurant
。我把同一个地址保存在数据库中两次,这导致了冗余和不一致。在这个问题与OOP中组合和继承的不同是相似的。在
是的,这是有区别的,您刚刚粘贴了到文档的链接,这就解释了这种差异。在
(2)中的
Restaurant
db表由两个额外的字段(serves_hot_dogs
和serves_pizza
)和一个记录在Place
db表中的Restaurant
。在根据这个问题,你应该用最适合你的型号。我通常在类似的情况下使用多表继承。在
在跳转到表继承之前,请参阅:https://django-model-utils.readthedocs.org/en/latest/managers.html#inheritancemanager。在处理多表继承时,我使用它来限制查询的数量。在
相关问题 更多 >
编程相关推荐