模型方法中的以下关系(django)

模型方法中的以下关系(django),django,django-models,Django,Django Models,我正在就我的具体实施寻求一些建议;我定义了发票和行项目模型(如下)。我的发票模型包含一个“发票总额”方法,该方法将与特定发票相关的所有行项目的行总额相加,从而得出发票总成本 这很管用。我只是想听听关于这是否是一个好的设计,或者是否有更好的方法来实现这一点的建议 class Invoice(models.Model): invoice_number = models.CharField(max_length=30) invoice_date = models.DateField()

我正在就我的具体实施寻求一些建议;我定义了发票和行项目模型(如下)。我的发票模型包含一个“发票总额”方法,该方法将与特定发票相关的所有行项目的行总额相加,从而得出发票总成本

这很管用。我只是想听听关于这是否是一个好的设计,或者是否有更好的方法来实现这一点的建议

class Invoice(models.Model):
    invoice_number = models.CharField(max_length=30)
    invoice_date = models.DateField()

    def __unicode__(self):
        return 'invoice %s issued on %s' % (self.invoice_number, self.invoice_date)

    def invoice_total(self):
        total = 0
        for each in self.lineitem_set.all():
            total = total + each.line_total()
        return total

class LineItem(models.Model):
    description = models.CharField(max_length=50)
    unit_price = models.DecimalField(max_digits=9, decimal_places=2)
    quantity = models.PositiveSmallIntegerField()
    invoice = models.ForeignKey(Invoice)

    def __unicode__(self):
        return '%s, QTY %s @ %s' % (self.description, self.quantity, self.unit_price)

    def line_total(self):
        return self.unit_price * self.quantity

这样做是可以的。虽然一开始使用
发票
来计算总额似乎有些尴尬,但它可以代替
行项目
,让您在将来决定向总额中添加税费和折扣时扩展模型。如果这样做,您可能还希望将
总计
存储在
发票
类中

另外,另一个建议是将
LineItem
中的
invoice
属性更改为

invoice = models.ForeignKey(Invoice, related_name='lineitems')

现在,在
Invoice
类中,您可以将其称为
self.lineitems
,而不是
self.lineitem\u set
。只是一个建议。

关于“相关名称”的观点很好。如果我确实想将所有行项目的总计保存到“总计”字段中。我猜我可以用发票总额法来做?我是否只需要
self.total=total
然后
self.save()
?是的,没错。在行项目上,您可以使用保存触发器更新发票上的总额。您还需要将
total
定义为
total=models.something…
再次建议覆盖save。