django_pandas.io の read_frame 使用時に、結合したテーブルの項目をデータフレームに格納する方法に少しつまづいたため、方法を記載しておきます。
models.pyは以下のとおりです。
商品テーブルと購入履歴テーブルがあり、購入履歴に ForeignKey が設定してあり、結合した上でitem_name、maker_name、purchase_date、quantityをデータフレームに格納したい状況でした。
from django.db import models
class Item(models.Model):
"""商品"""
item_name = models.CharField(verbose_name='商品名', max_length=32)
brand_name = models.CharField(verbose_name='ブランド名', max_length=32)
maker_name = models.CharField(verbose_name='メーカー名', max_length=20)
class Meta:
verbose_name_plural = 'Item'
def __str__(self):
return f'#{self.pk} {self.item_name}'
class PurchaseHistory(models.Model):
"""購入履歴"""
item = models.ForeignKey(Item, verbose_name='商品', on_delete=models.PROTECT)
purchase_date = models.DateField(verbose_name='購入日', max_length=32)
place = models.CharField(verbose_name='購入場所', max_length=32)
price = models.IntegerField(verbose_name='単価')
quantity = models.IntegerField(verbose_name='数量')
class Meta:
verbose_name_plural = 'PurchaseHistory'
views.pyを以下のとおりとすることで実現できました。
from django.views import generic
from .models import Item
from .models import PurchaseHistory
from django_pandas.io import read_frame
class View(generic.TemplateView):
model = PurchaseHistory
template_name = 'template.html'
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['breadcrumbs_list'] = [{'name': 'View', 'url': ''}]
queryset = PurchaseHistory.objects.select_related('item')
if not queryset:
return context
df = read_frame(queryset, fieldnames=['item__item_name', 'item__maker_name', 'purchase_date', 'quantity'])
item__maker_name のアンダースコアを2つ書くことに辿り着くまで少し時間を要しました。
Django参考書籍
Djangoの実装はこちらで学びました。
リンク