11

スキーマの説明

ここに画像の説明を入力してください

プロジェクトには複数のプロジェクトアイテムが含まれる可能性があり、プロジェクトアイテムには複数の取得コストが含まれる可能性があります。たとえば、資本プロジェクト#1には、次の2つのプロジェクト項目が含まれています。

  1. 数量 購入した生産設備1台
    • サプライヤーから機器を購入するための1回の取得コスト5,000ドル
  2. 数量 スタッフによって構築された1つのテストフィクスチャ
    • 取得コストの合計が12,000ドルの場合、それぞれ1,000ドルの購入が12回行われます。

生産設備には、購入に関連するコストが1つしかない場合があります。ただし、テストフィクスチャには、その構築に関連する複数のコストがかかる可能性があります。

欲望

各項目の総取得コストを把握できるようにしたい。また、各プロジェクトの総取得コストを把握できるようにしたい。上記の例に基づく:

  • アイテム1の総取得コスト=5,000ドル
  • アイテム2の総取得コスト=12,000ドル
  • 資本プロジェクトの総取得コスト=17,000ドル

質問

  1. total_acquisition_costsDjangoの集計を使用して計算する必要がありますか、それともモデルにとして保存する必要がDecimalFieldありProjectますProjectItemか?

  2. およびモデルのtotal_acquisition_costsプロパティを作成する必要がありますか?私の直感は、プロパティを作成することはイエスです。ProjectItemProject

    私の直感は、データベースの非正規化を回避するために、集計を使用して値を計算することです。Sum具体的には、Djangoの集計関数を使用してプロパティを作成することに傾倒していtotal_acquisition_costsます。ただし、ディクショナリではなく値を返すように、モデルにプロパティとして集計を配置する方法を模索しているわけではありません。

現在のコード

注:私の現在のコードはDjangoの集約機能を使用していませんが、機能します。

class ProjectItem(models.Model):
    project = models.ForeignKey(CapExProject)
    name = models.CharField(max_length=128)

    @property
    def total_acquisition_costs(self):
        acquisition_costs = self.acquisitioncost_set.only(
                'amount')
        total_acquisition_costs = 0
        for acquisition_cost in acquisition_costs:
        total_acquisition_costs += acquisition_cost.amount
        return total_acquisition_costs
4

1 に答える 1

14

Sum を使用するが、それをプロパティにするというあなたのアイデアが気に入っています。このようなものが動作するはずです:

class Project(models.Model):
    @property
    def total_acquisition_costs(self):
        return AcquisitionCost.objects.filter(item__project=self).aggregate(total=Sum("amount"))["total"]

class ProjectItem(models.Model):
    @property
    def total_acquisition_costs(self):
        return self.acquisitioncost_set.aggregate(total=Sum("amount"))["total"]
于 2011-10-19T20:09:26.493 に答える