ユーニックス総合研究所

  • home
  • archives
  • django-create

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の使用者)が作るフィールドです。

たとえばモデルにnamecontentという文字列のフィールドが定義されていたとします。
その場合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というモデルを作ります。
このモデルにはnamecontentというフィールドを定義します。
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()は知っておくとコード量を減らせる便利なメソッドです。
あなたの開発でも活用されてみてはいかがでしょうか。

🦝 < 少ないことは良いことだ