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

时间:2014-08-03 10:47:46

标签: django django-models

我正在就具体实施提出一些建议;我定义了Invoice和LineItem模型(如下所示)。我的发票模型包含'invoice_total'方法,该方法汇总与特定发票相关的所有订单项的总计,并为我提供总发票费用。

这很好用。如果这是一个好的设计,或者是否有更好的方法来实现这一点,我只是在听取一些建议?

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

1 个答案:

答案 0 :(得分:0)

这样做是可以的。虽然最初使用Invoice计算总数而不是LineItem似乎很尴尬,但如果您决定在总计中添加税金和折扣,则可以在将来扩展模型。如果您这样做,您可能还希望将total存储在Invoice课程中。

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

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

现在,在Invoice课程中,您可以将其称为self.lineitems而不是self.lineitem_set。只是一个建议。