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

时间:2014-05-18 07:53:59

标签: python django django-models orm

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

嗯,这两个是否存在任何主要差异?我应该使用哪一个?

2 个答案:

答案 0 :(得分:1)

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

由于Restaurant是特殊Place,这意味着餐厅有字段nameaddress,此外,餐厅还有字段serves_hot_dogs和{{1 }}

考虑到以上描述,所有解决方案都是合理的。但是,serves_pizzaRestaurantPlace必须可以处理为Restaurant。 在解决方案1中,PlaceRestaurant是分开的,您无法将Place作为Restaurant处理。(仅考虑OOP)

另一方面,在solution1中,如果我保存一个地址为A的Place,并添加一个具有相同地址的Place。我在数据库中保存了两次相同的地址,导致冗余和不一致。


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

答案 1 :(得分:0)

是的,存在差异,您只是粘贴了文档链接,这解释了这种差异。

Restaurant(2)中的db表包含两个额外字段(serves_hot_dogsserves_pizza)和一个ForeignKey以记录在Place db表中。

根据您应该使用哪种型号的问题 - 最适合您的型号。我通常在类似的情况下使用多表继承。

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