サンプルのデータベース定義 2022/08/06 10 DEMOのため、簡単なサンプルを作りました。 (GitHubにアップしてあるので、最後にURLをお知らせします。) • 個人情報をDB管理 • 都道府県、地方(関東地方、近畿地方、など)、性別(男、女)をマスタ管理 個人情報本体 性別マスタ 都道府県マスタ 地方マスタ Model : Person Model : Sex Model : Prefecture Model : District
Python DjangoでのRDB検索の期待 2022/08/06 12 person_list: List[Person] = Person.objects.filter(prefecture__name__contains = '京都')[:10] 都道府県の名前に「京都」を含む(「東京都」「京都府」がヒット)レコードを検索して、先頭10件を取得する例: 関連するテーブルをJOINして、こんな感じで検索してくれると期待していました。 SELECT `p`.*, `ms`.*, `md`.*, `mp`.* FROM `person` AS `p` INNER JOIN `master_sex` AS `ms` ON `p`.`sex_id` = `ms`.`id` INNER JOIN `master_prefecture` AS `mp` ON `p`.`prefecture_id` = `mp`.`id` INNER JOIN `master_district` AS `md` ON `mp`.`district_id` = `md`.`id` WHERE `mp`.`name` LIKE '%京都%' ORDER BY `p`.`id` LIMIT 100 ; ところが、そんなに甘くはありませんでした。
Djangoでの検索をJOINで一気に取ってくる方法はないか? 2022/08/06 15 関連するテーブルをJOINして、こんな感じで検索する方法はないか? SELECT `p`.*, `ms`.*, `md`.*, `mp`.* FROM `person` AS `p` INNER JOIN `master_sex` AS `ms` ON `p`.`sex_id` = `ms`.`id` INNER JOIN `master_prefecture` AS `mp` ON `p`.`prefecture_id` = `mp`.`id` INNER JOIN `master_district` AS `md` ON `mp`.`district_id` = `md`.`id` WHERE `mp`.`name` LIKE '%京都%' ORDER BY `p`.`id` LIMIT 100 ; • JOINするテーブルの参照項目を定義(テーブル名ではなく、参照フィールド) • SELECTで取得する項目を定義 • モデルでfilterする前にselect_relatedメソッドを呼び出す(引数:JOINするテーブルの参照項目) • filterの後でvaluesメソッドを呼び出す(引数:取得する項目) 探してみたら、あった!!
サンプルのデータベース定義(おさらい) 2022/08/06 16 10を超えるテーブルでサンプルを作るのは大変なので、簡単なサンプルを作りました。 (gitlabにアップしてあるので、最後にURLをお知らせします。) • 個人情報をDB管理 • 都道府県、地方(関東地方、近畿地方、など)、性別(男、女)をマスタ管理 個人情報本体 性別マスタ 都道府県マスタ 地方マスタ Model : Person Model : Sex Model : Prefecture Model : District