導入
保存したデータを取り出せなければ意味がありません。全件・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()… 全レコードを返す(QuerySet。forで回せます)。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)。