3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Django学習備忘録 -models.pyで作成したDBへの保存方法-

Posted at

はじめに

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メソッドを呼び出すことです。

  1. モデルインスタンスの作成:
    あるモデルPersonがあるとしましょう。新しいインスタンスを作成するには以下のようにします:

    my_app.py
    from myapp.models import Person
    
    person = Person(name="John Doe", age=25)
    
  2. インスタンスの保存:
    モデルインスタンスを作成したら、そのインスタンスをデータベースに保存するにはsaveメソッドを呼び出します:

    my_app.py
    person.save()
    

これで、新しいPersonインスタンスがデータベースに保存されます。なお、すでに存在するインスタンスのフィールドを更新する場合もsaveメソッドを使用します。

複数のデータをbulk_createメソッドで一度に保存する

一度に複数のモデルインスタンスをデータベースに保存する場合はbulk_createメソッドを使用することができます。

my_app.py
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をデータベースに保存するときに使っています。

my_app.py
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メソッドもあり、これを使うとモデルインスタンスの作成と保存を一度に行うことができます:

my_app.py
person = Person.objects.create(name="John Doe", age=25)

インスタンスを作成したあとデータの加工をする必要が無い場合にsaveメソッドを使うよりコードの省略できます。

まとめ

Djangoモデルを使用することで使用するデータベースによることなく一律の記載で保存をすることができます。
インスタンスを作成そのまま保存したい場合は"createメソッド"
インスタンスを作成し加工等処理を行なった場合は"saveメソッド"
複数のデータを一括で保存したい場合は"bulk_createメソッド" を使用する。

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?