我正在努力找出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
可能由出版相同或另一本书的公司打印:换句话说,表格可以重叠。因此,两个模型Printer
和Publisher
应该真正合并,而它们需要在管理员中保持不同。
我的问题:如何做到最好?我应该创建另一个模型Firm
,并在其与Printer
/ Publisher
之间创建一对一的关系吗?
答案 0 :(得分:0)
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
。