Djangoのmodelのcreate()の使い方【Python】
- 作成日: 2020-11-27
- 更新日: 2023-12-24
- カテゴリ: Python
Djangoのモデルのcreate()の使い方
Django(ジャンゴ)はプログラミング言語PythonのWebフレームワークです。
フルスタック・Webフレームワークと呼ばれ、これ1つでいろいろなWebアプリを作ることが可能になっています。
DjangoはMVT(エム・ブイ・ティー)というアーキテクチャを採用しています。
MVTのMはModel(モデル)のMです。
モデルとはデータベースのレコードを抽象化したオブジェクトで、Djangoではこのモデルを扱うことでデータベースに多様な操作を実行することが出来ます。
その操作の1つにModel.objects.create()
というメソッドがあります。
これはモデルからオブジェクトを1つ作成し、データベースに保存(するクエリを発行)するメソッドです。
この記事ではModel.objects.create()
メソッドについて解説していきます。
Model.objects.create()の構造
Model.objects.create()
はDjangoのquery.py
モジュール内で定義されています。
その構造は↓のようになっています。
def create(self, **kwargs):
"""
Create a new object with the given kwargs, saving it to the database
and returning the created object.
"""
obj = self.model(**kwargs)
self._for_write = True
obj.save(force_insert=True, using=self.db)
return obj
↑のコードを見ると、やってることはヘルパー的な操作で、create()
メソッドがただの便利メソッドであることがわかります。
引数と返り値について見てみましょう。
**kwargs(第1引数)
create()
の引数はキーワード引数です。
キーワード引数とは、たとえばcreate(cat='nyan', dog='wan')
といった、キー(cat
)と値(nyan
)が組になっている引数のことです。
このcreate()
のキーワード引数には「フィールド名=値
」というフォーマットでキーと値を指定します。
フィールド名とはモデルに定義されているフィールドのことです。これは開発者(Djangoの使用者)が作るフィールドです。
たとえばモデルにname
とcontent
という文字列のフィールドが定義されていたとします。
その場合create()
の呼び出しは↓のようになります。
Model.objects.create(name='Taro', content='Hello, World!')
返り値
Model.objects.create()
の返り値はモデルによって変わります。
create()
自体はモデルのオブジェクトを返します。
たとえばmodels.py
などにPost
というモデルを定義したとします。
その場合、create()
の呼び出しはPost.objects.create()
になります。
このとき、create()
の返す値はPost
モデルのオブジェクトです。
このとき、返されるPost
オブジェクトはすでにsave()
が呼ばれた状態です。
モデルを作る
解説のために簡単なモデルを作ります。
掲示板のWebアプリを作るという想定で、掲示板への投稿内容を表すPost
というモデルを作ります。
このモデルにはname
とcontent
というフィールドを定義します。
name
は投稿者名を表し、content
は投稿内容を表します。
from django.db import models
class Post(models.Model):
name = models.CharField(max_length=128, help_text='投稿者名')
content = models.TextField(max_length=1024, help_text='投稿内容')
↑のように定義しました。
今回の解説とはあまり関係ありませんが、name
の最大長は128
, content
の最大長は1024
にしてあります。
このモデルを使ってPost.objects.create()
について解説してみたいと思います。
Post.obects.create()を使ってみる
ビューからPost.objects.create()
を使うには↓のようにします。
from django.shortcuts import render
from .models import Post
def home_view(request):
context = {}
post = Post.objects.create(name='名無しさん', content='おなかいっぱい')
context['post'] = post
return render(request, 'core/home.html', context)
今回はhome_view
というビューでPost.objects.create()
を使う想定です。
肝心の部分にフォーカスしましょう。
post = Post.objects.create(name='名無しさん', content='おなかいっぱい')
↑のようにPost.objects.create()
のキーワード引数にモデルのフィールド名を指定し、そのフィールドにセットしたいデータを渡すと、そのデータで初期化されたモデルのオブジェクトが生成されます。
post = Post.objects.create(name='名無しさん', content='おなかいっぱい')
print('name', post.name)
print('content', post.content)
↑のようにPost.objects.create()
で作成したオブジェクトのフィールドを参照すると、↓のように表示されます。
name 名無しさん
content おなかいっぱい
↑を見ると指定した値でフィールドが初期化されているのがわかります。
↓のコードを見て頂くとわかりますが、Model.objects.create()
はモデルの初期化とDBへの保存(クエリの発行)を同時に行います。
def create(self, **kwargs):
# ↓でモデルからオブジェクトを作成し
obj = self.model(**kwargs)
self._for_write = True
# ↓ここでsave()を呼び出している
obj.save(force_insert=True, using=self.db)
return obj
そのためPost.objects.create()
を呼び出した時点でモデルの保存は行われていることになります。
フィールドのデフォルト値との関係
たとえばPost
モデルのname
フィールドにdefault
を設定したとします。
from django.db import models
class Post(models.Model):
# ↓これ
name = models.CharField(default='名無しさん', max_length=128, help_text='投稿者名')
content = models.TextField(max_length=1024, help_text='投稿内容')
default
引数はモデルのオブジェクトの作成時に、フィールドにデフォルトで設定する値を指定する引数です。
↑の場合、name
のデフォルト値は「名無しさん
」という文字列になります。
このdefault
を設定しているフィールドは、Model.objects.create()
で省略できます。
たとえば↓のようにです。
post = Post.objects.create(content='おなかいっぱい')
もちろん明示的にname
を指定することも出来ます。
post = Post.objects.create(name='疾風のカステラ', content='おなかいっぱい')
Model()とModel.objects.create()の違い
繰り返しになりますが、Model.objects.create()
はモデルからのオブジェクトの作成と、DBへの保存(クエリの発行)を同時に行います。
いっぽうModel()
などでマニュアル的にモデルからオブジェクトを生成する場合は、オブジェクトの保存は開発者が自由に行うことが出来ます。
# 自動的なオブジェクトの作成と保存
post = Post.objects.create(name='名無しさん', 'おなかいっぱい')
# マニュアル的なオブジェクトの作成と保存
post = Post(name='名無しさん', 'おなかいっぱい')
post.save()
プログラムの文脈によって↑の2種類の書き方は使い分けることが多いです。
保存のタイミングを自分で操作したい場合などは後者の書き方を使います。
おわりに
Model.objects.create()
は知っておくとコード量を減らせる便利なメソッドです。
あなたの開発でも活用されてみてはいかがでしょうか。
🦝 < 少ないことは良いことだ