Python | Django | モデルを用いたデータベースからのデータ取得方法
公開日:2021/6/29
Pythonには,DjangoというWebアプリケーションフレームワークがある.フレームワークのため,Djangoを利用するとWebアプリを通常よりも短時間で開発することが可能になる.
前記事にて,「モデルを用いたデータベースへのデータ追加方法」を記した.前記事での設定をそのまま引き継いだ上で,本記事では,「モデルを用いたデータベースからのデータ取得方法」を以下3つの構成にて記す.
◆実施環境
Python 3.8.8
Django 3.2.3
“all()"を利用して,DBから全ての値(データ)を取得する.
“model_project"に"get_val.py"を作成する.
“all()"を以下のように利用し,"get_val.py"を編集する.
import os
os.environ.setdefault('DJANGO_SETTINGS_MODULE','model_project.settings')
from django import setup
setup()
from model_app.models import Cake
cakes = Cake.objects.all()
print(cakes)
“get_val.py"の画面上で右クリックをすると以下コマンドが出現するので,赤枠の"Run Python File in Terminal"をクリックする.
ターミナルには以下が出力される.
<QuerySet [<Cake: Cake object (3)>, <Cake: Cake object (2)>, <Cake: Cake object (1)>]>
値である"Cake object ()"を取得するため,"for ~ in"を以下のように利用し,"get_val.py"を編集する.
import os
os.environ.setdefault('DJANGO_SETTINGS_MODULE','model_project.settings')
from django import setup
setup()
from model_app.models import Cake
cakes = Cake.objects.all()
for cake in cakes:
print(cake)
“Run Python File in Terminal"をクリックすると,ターミナルには以下が出力され,各値を取得することができた.
Cake object (3)
Cake object (2)
Cake object (1)
■ターミナルでの出力方法の変更
ターミナルでの出力は上記のように"Cake object ()"になっている.出力を別の値である"ケーキ名(cake_name)"にする方法は以下2通りある.
(a) “model_app/models.py"の変更
(b) “get_val.py"の変更
2通りの詳細を以下に記す.
(a) “model_app/models.py"の変更
“model_app/models.py"の"class Cake"内に"def __str__"を以下のように追加する.
class Cake(Date):
cake_name = models.CharField(max_length=40)
birthplace = models.CharField(max_length=40)
birthday = models.DateField(default='1900-01-01')
inventor = models.CharField(max_length=40)
sales_amounts = models.IntegerField()
like = models.BooleanField(default=True)
email = models.EmailField(db_index=True)
web_site = models.URLField()
feed_back = models.TextField(null=True,blank=True)
class Meta:
db_table = 'cake'
index_together = [['cake_name','inventor']]
ordering = ['birthday']
def __str__(self): # 追記箇所
return f'{self.cake_name}'
“get_val.py"の画面上で"Run Python File in Terminal"を実行すると,ターミナルには以下のようにケーキ名が出力される.
Chiffon cake
Opera cake
Molten chocolate cake
(b) “get_val.py"の変更
“get_val.py"を以下のように変更し,編集する.
変更前:print(cake)
変更後:print(cake.cake_name, cake)
import os
os.environ.setdefault('DJANGO_SETTINGS_MODULE','model_project.settings')
from django import setup
setup()
from model_app.models import Cake
cakes = Cake.objects.all()
for cake in cakes:
print(cake.cake_name, cake) # 追記箇所(cake.cake_name)
“get_val.py"の画面上で"Run Python File in Terminal"を実行すると,ターミナルには以下のようにケーキ名と"Cake object()"が出力される.
Chiffon cake Cake object (3)
Opera cake Cake object (2)
Molten chocolate cake Cake object (1)
“get()"を利用すると,DBから1件の値を取得することができる.2件以上ある場合はエラーとなる.そのため,"get()"を利用する場合は,引数に"pk"を選択することが多くなる.以下(1)~(2)の構成で説明する.
(1) DBから値を取得できるケース
(2) エラーケース
以下に上記2通りのケースを記す.
(1) DBから値を取得できるケース
以下条件に基づき,"get()"を以下のように利用し,"get_val.py"を編集する.
条件:「"pk"が1」
import os
os.environ.setdefault('DJANGO_SETTINGS_MODULE','model_project.settings')
from django import setup
setup()
from model_app.models import Cake
cakes = Cake.objects.get(pk=1) # 以下変更箇所
print(cakes.cake_name)
“get_val.py"の画面上で"Run Python File in Terminal"を実行すると,ターミナルには以下のようにケーキ名が出力される.
Molten chocolate cake
(2) エラーケース(条件が1件超)
以下条件に基づき,"get()"を以下のように利用し,"get_val.py"を編集する.
条件:「birthplace = 'France’」
import os
os.environ.setdefault('DJANGO_SETTINGS_MODULE','model_project.settings')
from django import setup
setup()
from model_app.models import Cake
cakes = Cake.objects.get(birthplace = 'France') # 以下変更箇所
print(cakes.cake_name)
“get_val.py"の画面上で"Run Python File in Terminal"を実行すると,条件に合致する値が1件超だったので,ターミナルには以下エラーが出力される.
get() returned more than one Cake -- it returned 2!
“filter()"を利用すると,DBから1件超の値を取得してもエラーにならない.取得する値が無い場合,空のQuerysetを返す."filter()"の場合,フィールドルックアップ(field lookups)と言われる “startswith"(~から始まる), “endswith"(~で終わる), “gt"(超), “gte"(以上), “lt"(未満), “lte"(以下)などを利用することができる.以下(1)~(3)の構成で説明する.
(1) 基本の利用
(2) “startswith"(~から始まる), “endswith"(~で終わる)の利用
(3) “gt"(超), “gte"(以上), “lt"(未満), “lte"(以下)の利用
以下に詳細を記す.
(1) 基本の利用
以下条件に基づき,"filter"を以下のように利用し,"get_val.py"を編集する.
条件:「birthplace = 'France’」
import os
os.environ.setdefault('DJANGO_SETTINGS_MODULE','model_project.settings')
from django import setup
setup()
from model_app.models import Cake
cakes = Cake.objects.filter(birthplace='France') # 以下変更箇所
for cake in cakes:
print(cake.cake_name)
“get_val.py"の画面上で"Run Python File in Terminal"を実行すると,ターミナルには以下内容が出力される.
Opera cake
Molten chocolate cake
(2) “startswith"(~から始まる), “endswith"(~で終わる)の利用
以下条件に基づき,"filter"に加え,フィールドルックアップの"startswith"を以下のように利用し,"get_val.py"を編集する.
条件:「birthplaceで’F’から始まる」
import os
os.environ.setdefault('DJANGO_SETTINGS_MODULE','model_project.settings')
from django import setup
setup()
from model_app.models import Cake
cakes = Cake.objects.filter(birthplace__startswith='F') # 変更箇所
for cake in cakes:
print(cake.cake_name)
“get_val.py"の画面上で"Run Python File in Terminal"を実行すると,ターミナルには以下内容が出力される.
Opera cake
Molten chocolate cake
(3) “gt"(超), “gte"(以上), “lt"(未満), “lte"(以下)の利用
以下条件に基づき,"filter"に加え,フィールドルックアップの"gt"を以下のように利用し,"get_val.py"を編集する.
条件:「"sales_amounts"で2000超」
import os
os.environ.setdefault('DJANGO_SETTINGS_MODULE','model_project.settings')
from django import setup
setup()
from model_app.models import Cake
cakes = Cake.objects.filter(sales_amounts__gt=2000) # 変更箇所
for cake in cakes:
print(cake.cake_name)
“get_val.py"の画面上で"Run Python File in Terminal"を実行すると,ターミナルには以下内容が出力される.
Chiffon cake
以上