本文へスキップ
BecomeCoder

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

更新と削除 ― save / update / delete

ブラウザで完結

導入

データは作って終わりではありません。値を書き換えたり、消したりします。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 Task(models.Model):
    title = models.CharField(max_length=100)
    done = models.BooleanField(default=False)
    class Meta:
        app_label = "todo"

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

Task.objects.create(title="牛乳を買う")
Task.objects.create(title="メールを返す")
Task.objects.create(title="レポート提出")

# ① 1件を取り出して属性を変え、save() で保存
t = Task.objects.get(title="牛乳を買う")
t.done = True
t.save()
print("牛乳:", Task.objects.get(title="牛乳を買う").done)   # True

# ② 条件に合う複数をまとめて更新(update)
Task.objects.filter(done=False).update(title="(未完了)")
print("未完了に変えた件数:", Task.objects.filter(title="(未完了)").count())

# ③ 削除
Task.objects.get(title="牛乳を買う").delete()   # 1件削除
print("残り:", Task.objects.count())

# 条件に合う全部を削除することもできる
Task.objects.filter(title="(未完了)").delete()
print("最終:", Task.objects.count())
  • 1件更新get で取り出し、属性を書き換えて save()
  • 一括更新filter(...).update(フィールド=値)データベース側で一気に更新するので速い(この場合 save() は呼ばれません)。
  • 削除 … 対象の .delete()filter(...).delete() で条件に合う全件を削除。

やってみよう

t.done = True; t.save() の対象タイトルを変えて、別のタスクを完了にしてみましょう。update(...) の条件を変えると、まとめて書き換わる件数が変わります。

演習

「レポート提出」タスクの doneTrue にして保存し、done=True のタスクの件数を表示してください(牛乳も True にしているので、両方 True にできれば件数は増えます)。まず done=True の件数が 1 以上になることを確認します。

ヒント1を見る

t = Task.objects.get(title="レポート提出"); t.done = True; t.save()

ヒント2を見る

print("完了件数:", Task.objects.filter(done=True).count())

実際に動かしてみよう

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

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

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