【问题标题】:Model redundant django tables?为冗余的 Django 表建模?
【发布时间】:2014-10-11 21:56:42
【问题描述】:

我正在研究一个 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 可能经常由出版同一本书或另一本书的公司印刷:换句话说,表格可以重叠。因此,PrinterPublisher 这两个模型应该真正结合起来,同时它们需要在管理中保持不同。

我的问题:如何最好地做到这一点?我应该创建另一个模型Firm,并在它和Printer/Publisher 之间建立一对一的关系吗?

【问题讨论】:

    标签: python database django database-design django-models


    【解决方案1】:

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

    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

    【讨论】:

    • 好的,这是个好主意。不过,我不确定。这不会仍然创建两个表,一个用于Publisher,另一个用于Printer?我认为我需要一张表来处理这两个问题,所以我没有多余的数据。例如,Penguin Books 可能会出版一本书并打印第二本书:我不希望在两个表中都有Penguin 的记录。这有意义吗?也许我应该澄清我的问题。
    • 如果这本书出版了,我会创建一个BooleanField 然后说yes/no
    • 哎呀刚刚意识到我没有将此标记为已回答。固定的。谢谢!
    • 好!很高兴我们都在一年后仍在编码!
    猜你喜欢
    • 1970-01-01
    • 2016-06-29
    • 1970-01-01
    • 1970-01-01
    • 2014-11-26
    • 2017-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多