具有相同或相似字段的Django模型

2024-09-29 01:32:39 发布

您现在位置:Python中文网/ 问答频道 /正文

我开始学习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中可用,尽管数据将驻留在不同的数据库表中。在

嗯,这两者之间有什么主要区别吗?我该用哪一个呢?在


Tags: djangoname模型modeladdressmodelsplacerestaurant
2条回答

在这种情况下,我认为您应该使用继承(解决方案2)。在

因为Restaurant是一个特殊的Place,意味着餐厅有name和{},另外,餐厅有{}和{}。在

综上所述,所有的解决方案都是合理的。但是,RestaurantPlaceRestaurant必须作为Place处理。 在解决方案1中,RestaurantPlace是分开的,不能将Restaurant作为Place来处理(只考虑OOP)

另一方面,在解决方案1中,如果我用地址a保存一个Place,然后添加一个具有相同地址的Restaurant。我把同一个地址保存在数据库中两次,这导致了冗余和不一致。在


这个问题与OOP中组合和继承的不同是相似的。在

是的,这是有区别的,您刚刚粘贴了到文档的链接,这就解释了这种差异。在

(2)中的Restaurantdb表由两个额外的字段(serves_hot_dogsserves_pizza)和一个记录在Placedb表中的Restaurant。在

根据这个问题,你应该用最适合你的型号。我通常在类似的情况下使用多表继承。在

在跳转到表继承之前,请参阅:https://django-model-utils.readthedocs.org/en/latest/managers.html#inheritancemanager。在处理多表继承时,我使用它来限制查询的数量。在

相关问题 更多 >