3

質問

バックグラウンド

複数のアイテムを含めることができる請求書をモデル化しています。Invoice モデルと Item モデルの間の多対多の関係は、InvoiceItem 中間テーブルを通じて処理されます。

請求書の合計金額 — <code>amount_invoiced — は、指定された請求書の各アイテムのunit_priceとの積を合計することによって計算されます。以下は、これを達成するために現在使用しているコードですが、 Django の集計機能quantityを使用してこれを処理するより良い方法があるかどうか疑問に思っていました。

現在のコード

class Item(models.Model):
    item_num = models.SlugField(unique=True)
    description = models.CharField(blank=True, max_length=100)


class InvoiceItem(models.Model):
    item = models.ForeignKey(Item)
    invoice = models.ForeignKey('Invoice')
    unit_price = models.DecimalField(max_digits=10, decimal_places=2)
    quantity = models.DecimalField(max_digits=10, decimal_places=4)


class Invoice(models.Model):
    invoice_num = models.SlugField(max_length=25)
    invoice_items = models.ManyToManyField(Item,through='InvoiceItem')

    def _get_amount_invoiced(self):
        invoice_items = self.invoiceitem_set.all()
        amount_invoiced = 0
        for invoice_item in invoice_items:
            amount_invoiced += (invoice_item.unit_price *
                invoice_item.quantity)
        return amount_invoiced

    amount_invoiced = property(_get_amount_invoiced)        
4

1 に答える 1

2

はい、集計関数が導入された Django 1.1 以降で可能です。モデルのソリューションは次のとおりです。

 def _get_amount_invoiced(self):
     self.invoiceitem_set.extra(select=("item_total": "quantity * unit_price")
                                ).aggregate(total=Sum("item_total")["total"]

ただし、item_total をデータベースに保存することを強くお勧めします。これは、割引、税金、およびその他の変更により、いつでも計算することが非現実的または不可能になる可能性があるためです。

于 2010-03-30T09:17:54.970 に答える