スキーマの説明
プロジェクトには複数のプロジェクトアイテムが含まれる可能性があり、プロジェクトアイテムには複数の取得コストが含まれる可能性があります。たとえば、資本プロジェクト#1には、次の2つのプロジェクト項目が含まれています。
- 数量 購入した生産設備1台
- サプライヤーから機器を購入するための1回の取得コスト5,000ドル
- 数量 スタッフによって構築された1つのテストフィクスチャ
- 取得コストの合計が12,000ドルの場合、それぞれ1,000ドルの購入が12回行われます。
生産設備には、購入に関連するコストが1つしかない場合があります。ただし、テストフィクスチャには、その構築に関連する複数のコストがかかる可能性があります。
欲望
各項目の総取得コストを把握できるようにしたい。また、各プロジェクトの総取得コストを把握できるようにしたい。上記の例に基づく:
- アイテム1の総取得コスト=5,000ドル
- アイテム2の総取得コスト=12,000ドル
- 資本プロジェクトの総取得コスト=17,000ドル
質問
total_acquisition_costs
Djangoの集計を使用して計算する必要がありますか、それともモデルにとして保存する必要がDecimalField
ありProject
ますProjectItem
か?およびモデルの
total_acquisition_costs
プロパティを作成する必要がありますか?私の直感は、プロパティを作成することはイエスです。ProjectItem
Project
私の直感は、データベースの非正規化を回避するために、集計を使用して値を計算することです。
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