スポンサーリンク

【Django】テーブルを結合してデータフレームに取得する方法

記事内に広告が含まれています。

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の実装はこちらで学びました。

タイトルとURLをコピーしました