代码之家  ›  专栏  ›  技术社区  ›  allanberry Michael Palmer

为冗余django表建模?

  •  0
  • allanberry Michael Palmer  · 技术社区  · 12 年前

    我正在研究Django项目的模型:一个跟踪应用程序 Books .

    在其他字段中,每本书都有 Printer 和一个 Publisher ,它们基本相同。下面是它的表现:

    class Book(models.Model):
        title     = models.CharField(max_length=100)
        printer   = models.ForeignKey('Printer')
        publisher = models.ForeignKey('Publisher')
    
    class Printer(models.Model):
        name      = models.CharField(max_length=100)
        location  = models.CharField(max_length=100)
    
    class Publisher(models.Model):
        name      = models.CharField(max_length=100)
        location  = models.CharField(max_length=100)
    

    在我看来,这是一个糟糕的数据库形式:它不是DRY。此外,通常情况下 Book 可能由出版同一本书或另一本书的公司印刷:换句话说,表格可能会重叠。所以,这两个模型 打印机 和 出版商 应该真正结合起来,而它们需要在管理中保持不同。

    我的问题是:如何最好地做到这一点?如果我创建另一个模型, Firm ,并在它和 打印机 / 出版商 ?

    1 回复  |  直到 12 年前
        1
  •  0
  •   Aaron Lelevier    12 年前

    Django处理这个问题的方法是创建一个 Abstract Base Model 。这是创建模型的干燥方法。代码如下:

    class BaseModel(models.Model):
        name      = models.CharField(max_length=100)
        location  = models.CharField(max_length=100)
    
        class Meta:
            abstract = True
    
    class Printer(BaseModel):
        pass
    
    class Publisher(BaseModel):
        pass
    

    这将允许您只指定一次冗余字段。此外,如果您需要向一个模型添加任何额外的字段,只需添加它们,而不是使用 pass .

    推荐文章