簡體   English   中英

更好的django模型設計

[英]better django model design

這是我的情況:

我有一個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模型設計嗎?

謝謝

您可以創建一個抽象基類,並讓兩個模型繼承它:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM