現在Djangoで、見積モデル(Estimates)と受注モデル(Orders)が、それぞれ顧客モデル(Clients)をForeignKeyで参照しています。
顧客一覧ページで、各顧客ごとの見積数および受注数を表示する為、顧客モデル(Clients)から見積モデル(Estimates)および受注モデル(Orders)を逆参照して、顧客ごとの見積件数、受注件数を表示したい
モデルの関係は以下の通りです。
models.py
class Clients(models.Model):
name = models.CharField(max_length=255)
name_kana = models.CharField(max_length=255, null=True, blank=True)
// 省略
class Estimates(models.Model):
client = models.ForeignKey(Clients, null=True, blank=True, on_delete=models.PROTECT)
estimate_date = models.DateField()
// 省略
class Orders(models.Model):
client = models.ForeignKey(Clients, null=True, blank=True, on_delete=models.PROTECT)
order_date = models.DateField()
// 省略
顧客一覧ページのUIは以下の通りで、Clientsモデルからデータを取得しforループで表示させています。
views.py
data = Clients.objects.all()
page = Paginator(data, 3)
params = {
'data' : page.get_page(num)
}
return render(request, 'sales/client.html', params)
template
{% for item in data %}
<tr>
<td>{{item.id}}</td>
<td class="text-nowrap">{{item.name}}</td>
<td class="text-nowrap">〒{{item.zipcode}} {{item.prefecture}}{{item.address|truncatechars:20}}</td>
<td>5</td>
<td>6</td>
<td class="text-nowrap"><button class="btn btn-light" onclick="location.href='/client/detail/{{item.id}}'">詳細</button> <button class="btn btn-light" onclick="location.href='/client/edit/{{item.id}}'">編集</button> <a href="#modal"><button class="btn btn-light del" id="{{item.id}}" value="{{item.name}}">削除</button></a></td>
</tr>
{% endfor %}
やり方を色々調べたが、同じようなことをやってるトラブルシューティングがなく、大苦戦。。。。
だが、さらに調べていると、どうやら「1データを基準にするだけなら *.${modelName}_set という書き方で逆参照可能」らしい。
逆参照は、forループを回しているテンプレート側でやると上手くいかなかったので、views.py側で処理をする事にした。
具体的には、Clientsモデルから顧客データを取得し、forループで各顧客データごとの見積数、受注数を逆参照して、配列に追加し、テンプレート側では呼び出すだけにした。
client.estimates_set.count()、client.orders_set.count()で、レコード数を取得している。
data = Clients.objects.all()
i = 0
for item in data:
client = Clients.objects.get(id=item.id)
data[i].estimate = client.estimates_set.count()
data[i].order = client.orders_set.count()
i += 1
page = Paginator(data, 3)
params = {
'data' : page.get_page(num)
}
return render(request, 'sales/client.html', params)
{% for item in data %}
<tr>
<td>{{item.id}}</td>
<td class="text-nowrap">{{item.name}}</td>
<td class="text-nowrap">〒{{item.zipcode}} {{item.prefecture}}{{item.address|truncatechars:20}}</td>
<td>{{item.estimate}}</td>
<td>{{item.order}}</td>
<td class="text-nowrap"><button class="btn btn-light" onclick="location.href='/client/detail/{{item.id}}'">詳細</button> <button class="btn btn-light" onclick="location.href='/client/edit/{{item.id}}'">編集</button> <a href="#modal"><button class="btn btn-light del" id="{{item.id}}" value="{{item.name}}">削除</button></a></td>
</tr>
{% endfor %}
おおおおおおおおお、上手くいきました。
疲れたわ。。😇😇😇