[Django3.0]ForeignKeyを使ったデータの取得・表示方法

見積一覧ページで、sales_estimatesテーブルに入っている各見積りデータを表示させたい。

▼ワイヤーフレーム

機能要件
– 見積の会社名は、hasManyのリレーション関係にあるsales_clientsのnameから引っ張って表示させたい
– 最新の登録順に表示させる
– 見積件数が増えた場合を想定して、ページネーションを実装する
– 見積の合計金額を表示させる

### views.py
– ${model}.object.all()でデータを取得する
– order_by(‘-id’)でidをdescで取得する
– *.count()で対象のレコード件数を取得できる
– *.aggregate(Sum(‘${columnName}’))で対象カラムの合計値を取得できる

from django.db.models import Sum

def estimate(request, num=1):
	data = Estimates.objects.all().order_by('-id')
	page = Paginator(data, 3)
	count = data.count()
	total = data.aggregate(Sum('total'))
	params = {
		'data' : page.get_page(num),
		'count' : count,
		'total' : total,
	}
	return render(request, 'sales/estimate.html', params)

### estimate.html
– sumの値は、view側でも{{total.total__sum}}と書いてあげる必要がある

<div class="row col-md-12">
				<label class="col-form-label col-md-3">検索結果 {{ count }}件</label>
				<label for="total" class="col-md-2 col-form-label">合計見積金額(円)</label>
				<input type="text" disabled id="total" class="form-control col-md-4 text-right" value="{{total.total__sum}}円" placeholder="" >
			</div>

– 親テーブルの値である会社名を表示させるには、item.client.nameというように、foreignKeyとそのテーブルのカラム名を繋げてあげれば良い

{% for item in data %}
						<tr>
							<td>{{item.id}}</td>
							<td class="text-nowrap">{{item.estimate_date}}</td>
							<td class="text-nowrap">{{item.client.name}}</td>
							<td class="text-nowrap">{{item.title}}</td>
							<td class="text-right">{{item.total}}円</td>
							<td class="text-nowrap"><button class="btn btn-light">詳細</button> <button class="btn btn-light">編集</button> <button class="btn btn-light" onclick="location.href='#modal'">削除</button></td>
							<td class="text-nowrap"><button class="btn btn-light">ダウンロード</button></td>
						</tr>
						{% endfor %}

Djangoの場合、エラー時に参考にする記事の英語の割合が増えるので、やってて面白い。
さて、次は、見積金額を表示させる際に、3桁以上の場合はカンマをつけたいですね。