本文へスキップ
BecomeCoder

Djangoコース · 第5章 モデルとデータベース · レッスン20

レコードの作成と取得 ― create / all / get

ブラウザで完結

導入

保存したデータを取り出せなければ意味がありません。全件・1件・条件付きの取り出し方を覚えましょう。

説明

import django
from django.conf import settings
if not settings.configured:
    settings.configure(DEBUG=True, SECRET_KEY="dev", INSTALLED_APPS=[],
        DATABASES={"default": {"ENGINE": "django.db.backends.sqlite3", "NAME": ":memory:"}})
    django.setup()

from django.db import models, connection

class Book(models.Model):
    title = models.CharField(max_length=100)
    price = models.IntegerField()
    class Meta:
        app_label = "shop"

with connection.schema_editor() as schema:
    schema.create_model(Book)

# 作成:create は「作って保存」を一度に行う
Book.objects.create(title="Python入門", price=2800)
Book.objects.create(title="Django実践", price=3200)
# もう一つの作り方:作ってから save()
b = Book(title="SQLの基礎", price=2500)
b.save()

# 全件取得
for book in Book.objects.all():
    print(book.id, book.title, book.price)

# 1件だけ取得(条件に合う「ちょうど1件」を返す)
one = Book.objects.get(title="Django実践")
print("get:", one.title, one.price)

# 件数と存在チェック
print("件数:", Book.objects.count())
print("2800円の本がある?", Book.objects.filter(price=2800).exists())
  • create(...) … 作成+保存を一発で。Model(...) してから .save() でも同じです。
  • all() … 全レコードを返す(QuerySetfor で回せます)。
  • get(条件) … 条件にちょうど1件合うものを返す。0件なら DoesNotExist、2件以上なら MultipleObjectsReturned という例外になります(「1件のはず」のときだけ使う)。
  • filter(条件).exists() … 条件に合うものがあるかを真偽で返す。

やってみよう

Book.objects.get(title="Python入門") のように別のタイトルで取得してみましょう。存在しないタイトルを get に渡すと DoesNotExist エラーになること(get は1件を保証する)も確かめられます。

演習

新しく Book.objects.create(title="テスト駆動開発", price=3600) を追加し、get を使って「テスト駆動開発」の価格を取り出して print してください。3600 が出力されれば成功です。

ヒント1を見る

b = Book.objects.get(title="テスト駆動開発")

ヒント2を見る

print(b.price)

実際に動かしてみよう

本文のサンプルや演習のコードは、コードブロック右上の「コピー」ボタンでコピーして、下のエディタに貼り付ければそのまま実行できます。

Python — ライブラリ付きで実行(Pyodide)

numpy / pandas / matplotlib が使える本物のPython(Pyodide)を読み込みます。初回のみ読み込みに少し時間がかかります(以降はブラウザにキャッシュされます)。
スクロールして表示された時点でも自動で読み込まれます。