更好的Django模型设计
这是我的情况:
我有一个Django模型:
class Invoice(models.Model):
invoiceid = models.CharField(max_length=20)
totalamount = models.DecimalField(max_digits=15,decimal_places=2,default=0)
downpayment = models.DecimalField(max_digits=15,decimal_places=2,default=0)
subtotal = models.DecimalField(max_digits=15,decimal_places=2,default=0)
tax = models.DecimalField(max_digits=15,decimal_places=2,default=0)
amountdue = models.DecimalField(max_digits=15,decimal_places=2,default=0)
payment = models.DecimalField(max_digits=15,decimal_places=2,default=0)
originaldate = models.DateTimeField()
changedate = models.DateTimeField()
version = models.IntegerField(default=1)
operator = models.CharField(max_length=20)
我还有一个几乎一模一样的模型,用来保存所有的更新历史。这个InvoiceHistory基本上就是记录所有的更新。
class InvoiceHistory(models.Model):
invoiceid = models.CharField(max_length=20)
totalamount = models.DecimalField(max_digits=15,decimal_places=2,default=0)
downpayment = models.DecimalField(max_digits=15,decimal_places=2,default=0)
subtotal = models.DecimalField(max_digits=15,decimal_places=2,default=0)
tax = models.DecimalField(max_digits=15,decimal_places=2,default=0)
amountdue = models.DecimalField(max_digits=15,decimal_places=2,default=0)
payment = models.DecimalField(max_digits=15,decimal_places=2,default=0)
originaldate = models.DateTimeField()
changedate = models.DateTimeField()
version = models.IntegerField()
operator = models.CharField(max_length=20)
我知道这样的设计效率不高,而且容易出错。每当业务逻辑发生变化时,我需要同时更新这两个模型,很容易就会忘记更新其中一个。有没有更好的Django模型设计来解决这个问题呢?
谢谢
1 个回答
9
你可以创建一个抽象的基类,然后让两个模型都从这个基类继承:
class InvoiceAbstract(models.Model):
invoiceid = models.CharField(max_length=20)
totalamount = models.DecimalField(max_digits=15,decimal_places=2,default=0)
downpayment = models.DecimalField(max_digits=15,decimal_places=2,default=0)
subtotal = models.DecimalField(max_digits=15,decimal_places=2,default=0)
tax = models.DecimalField(max_digits=15,decimal_places=2,default=0)
amountdue = models.DecimalField(max_digits=15,decimal_places=2,default=0)
payment = models.DecimalField(max_digits=15,decimal_places=2,default=0)
originaldate = models.DateTimeField()
changedate = models.DateTimeField()
version = models.IntegerField(default=1)
operator = models.CharField(max_length=20)
class Meta:
abstract = True
class Invoice(InvoiceAbstract):
pass
class InvoiceHistory(InvoiceAbstract):
pass
https://docs.djangoproject.com/en/dev/topics/db/models/#abstract-base-classes