【问题标题】:Django models with same or similar fields具有相同或相似字段的 Django 模型
【发布时间】:2014-05-18 07:53:58
【问题描述】:

我开始学习 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()

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

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

【问题讨论】:

标签: python django django-models orm


【解决方案1】:

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

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

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

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


这个问题和OOP中Composition and Inheritance的区别类似。

【讨论】:

    【解决方案2】:

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

    (2) 中的Restaurant db 表由两个额外字段(serves_hot_dogsserves_pizza)和一个ForeignKey 组成,用于记录在Place db 表中。

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

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

    【讨论】:

      猜你喜欢
      • 2011-08-05
      • 2015-08-22
      • 1970-01-01
      • 1970-01-01
      • 2019-02-13
      • 2021-11-14
      • 1970-01-01
      • 1970-01-01
      • 2012-08-27
      相关资源
      最近更新 更多