はじめに
Djangoの私的学習メモです。
ChatGPTにて調べた内容と追加で調べた内容を見返せるように記事としてまとめました。
情報の裏取りはしていないので間違いがありましたらご指摘いただけると幸いです。
データベースへの保存方法
大きく分けて2種類の方法がある。
Djangoモデルを経由して保存する方法と経由しない方法である。
Djangoモデルを経由しない方法はPythonの標準的なデータベースAPIを使用することで実装できる。
これにはPythonのsqlite3モジュールや、MySQLやPostgreSQLにアクセスするためのpsycopg2やmysql-connector-pythonなどがあるがここでは割愛する。
Djangoモデルを使用するメリット
Djangoはデータベースとのインタラクションを抽象化するためのORM(Object-Relational Mapping)を提供しています。これは、アプリケーションが使用するデータベースに関係なく、Pythonコードでデータベース操作を行うことを可能にします。
つまり、SQLiteを使用していても、MySQLを使用していても、PostgreSQLを使用していても、同じDjangoモデルのコード(例えばsaveメソッドやobjects.createメソッドなど)を使用してデータベースにデータを保存することができます。
そのため、データベースエンジンを変更する場合でも、ほとんどの場合、Pythonコードを変更する必要はありません。ただし、Djangoの設定でデータベースエンジンの設定を変更する必要はあります。
adminページから保存する
adminページからデータを記入し保存することができます。
よくブログサイトを作る例とか取り上げられているやつです。
詳細はリンク先を見てください。
インスタンスを作成した後saveメソッドで保存する
Djangoモデルを使用してデータベースにデータを保存する基本的な方法は、新しいモデルのインスタンスを作成し、そのsave
メソッドを呼び出すことです。
-
モデルインスタンスの作成:
あるモデルPerson
があるとしましょう。新しいインスタンスを作成するには以下のようにします:my_app.pyfrom myapp.models import Person person = Person(name="John Doe", age=25)
-
インスタンスの保存:
モデルインスタンスを作成したら、そのインスタンスをデータベースに保存するにはsave
メソッドを呼び出します:my_app.pyperson.save()
これで、新しいPerson
インスタンスがデータベースに保存されます。なお、すでに存在するインスタンスのフィールドを更新する場合もsave
メソッドを使用します。
複数のデータをbulk_createメソッドで一度に保存する
一度に複数のモデルインスタンスをデータベースに保存する場合はbulk_create
メソッドを使用することができます。
from myapp.models import Person
people = [
Person(name="John Doe", age=25),
Person(name="Jane Doe", age=30),
# ...
]
Person.objects.bulk_create(people)
このメソッドは一度に多数のレコードをデータベースに保存するための効率的な方法です。
個人的にはpandasのDataFrameをデータベースに保存するときに使っています。
def save_df_to_database(df):
persons = [
Person(
first_name=row['first_name'],
last_name=row['last_name'],
birth_date=row['birth_date'],
)
for index, row in df.iterrows()
]
Person.objects.bulk_create(persons)
dfからデータを1行ずつ取り出しインスタンスを作成、作成したインスタンスをリストに格納し、最後に一括でデータベースに保存しています。
createメソッドでインスタンスの作成と保存を一度に行う
モデルにはcreate
メソッドもあり、これを使うとモデルインスタンスの作成と保存を一度に行うことができます:
person = Person.objects.create(name="John Doe", age=25)
インスタンスを作成したあとデータの加工をする必要が無い場合にsaveメソッドを使うよりコードの省略できます。
まとめ
Djangoモデルを使用することで使用するデータベースによることなく一律の記載で保存をすることができます。
インスタンスを作成そのまま保存したい場合は"createメソッド" を
インスタンスを作成し加工等処理を行なった場合は"saveメソッド" を
複数のデータを一括で保存したい場合は"bulk_createメソッド" を使用する。