現在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 %}
おおおおおおおおお、上手くいきました。
疲れたわ。。😇😇😇