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

标签 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 中找到多表继承的工作原理如下: 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()

正如文档所说:Place 的所有字段也将在 Restaurant 中可用,尽管数据将驻留在不同的数据库表中。

那么,这两者之间有什么主要区别吗?我应该使用哪一个?

最佳答案

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

因为Restaurant是一个特殊的Place,这意味着Restaurant有字段nameaddress,另外,餐厅有字段 serves_hot_dogsserves_pizza

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

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

<小时/>

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

关于python - 具有相同或相似字段的 Django 模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23719759/

相关文章:

python - 导航栏无法正常工作-Django

python - Django urls.py 系统可以变成 Pylon 的路由吗?

python - 自定义管理器和 "through"

c++ - 使用 Boost.Python 设置包装类的元类

python - 如何重新排列子图,使一个在另一个下面?

python - 值错误 : Cannot query "": Must be "User" instance

Django ORM 返回陈旧数据,可能存在竞争条件

python - Tensorflow 中的可微分操作列表

python - Mypy 拒绝使用 `type(name, (bases,), {})` 创建的类型对象

python - Django 查询集显示英文翻译