我开始学习django,已经有一个问题:
如果表具有相似的字段,哪种模型创建更好?
1)Standart方式形式官方教程之类

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中发现了像这样的多表语言:
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)。

因为Restaurant是特殊的Place,这意味着Restaurant的字段为nameaddress,此外,Restaurant的字段为serves_hot_dogsserves_pizza

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

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



这个问题与OOP中的Composition和Inheritance不同。

10-07 12:34