Python | Django | モデルを用いたデータベースからのデータ取得方法

2021年6月29日

公開日:2021/6/29

Pythonには,DjangoというWebアプリケーションフレームワークがある.フレームワークのため,Djangoを利用するとWebアプリを通常よりも短時間で開発することが可能になる.

前記事にて,「モデルを用いたデータベースへのデータ追加方法」を記した.前記事での設定をそのまま引き継いだ上で,本記事では,「モデルを用いたデータベースからのデータ取得方法」を以下3つの構成にて記す.

  1. all()の利用したデータ取得方法
  2. get()の利用したデータ取得方法
  3. filter()の利用したデータ取得方法

    ◆実施環境

    Python 3.8.8
    Django 3.2.3

    1. all()の利用したデータ取得方法

    “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)
    1. get()の利用したデータ取得方法

    “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!
    1. filter()の利用したデータ取得方法

    “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

    以上