Djangoでのモデルコンポーネントの作り方【models.py】

Djangoでのモデルコンポーネントの作り方【models.py】

こんにちは、えびかずきです。

今回はDjangoプロジェクトでモデルコンポーネントを作り方について、
基本的な手順を簡単に説明します。

最近Webアプリ制作の勉強をしていて、だんだん全体像が見え始めてきたので、備忘録的にDjangoネタの記事を執筆しています。

私と同じようにDjangoを勉強しているけれど、よくわからなくて挫けそう、というような方の参考になれば幸いです。

一緒にWebアプリ制作の技術をマスターしていきましょう!

開発環境

OS:MacOS Catalina 10.15
Python:3.7.3
Django:2.2.2
PostgreSQL:10.3

モデルコンポーネントの役割

モデルコンポーネントの役割はデータベースとの連携です。

普通データベースと値をやり取りするには、SQLという言語を使ってデータベースをあやつる必要がありますが、Djangoフレームワークの提供するモデルコンポーネントを使うことでPythonコードでデータベースを操作することができます。

Djangoのモデルのようなデータベースとプロジェクト内のオブジェクトとを対応づける仕組みのことをO/Rマッピングといいます。

model.pyの設置場所

モデルコンポーネントの実質的なプログラムは『model.py』です。

『model.py』はDjangoプロジェクト中にアプリケーションを新規作成した時にデフォルトでアプリケーション直下のディレクトリに設置されます。

コードの書き方

『model.py』の中身は使用するモデルクラスの定義です。

モデルクラスはDjangoフレームワークが提供する『Django.db.models.Model』を親クラスとして継承して作成します。

モデルクラス作成の基本的なコードは以下のとおりです。

#モデルクラスの作成

from django.db import models

class モデル名(models.Model):
    フィールド名 = フィールドクラス(・・・,フィールドオプションの指定,・・・)

以下に実際のコード例をしめしました。

ここでは、『User_data』というモデルクラスを定義して、その中のフィールドオブジェクトとして『name』,『age』,『create_at』を作成しています。

#モデルクラスの作成例

from django.db import models

class User_data(models.Model):

    #Charfieldをインスタンス化してnameフィールドを作成
        #verbose_nameはフィールドオブジェクトに名前をつけている。
        #max_lengthは文字数に制限をかけている。    
    name = models.CharField(verbose_name='NAME', max_length=30)
    
    #Textfieldをインスタンス化してageフィールドを作成
        #blank=True,null=Trueはブランクとヌルを可にしている。 
    age = models.TextField(verbose_name='AGE', blank=True, null=True)
    
    #DataTimeFieldインスタンス化してcreate_atフィールドを作成
        #auto_now_add=Trueでレコード新規作成時に現在日付をセットする。   
    created_at = models.DateTimeField(verbose_name='作成日時', auto_now_add=True)
    
    #メタ情報として、このモデルクラスに名前をつけている。
    class Meta:
        verbose_name_plural = 'User_data'
   
    def __str__(self):
        return self.create_at

『def __str__(self):』とは何は?
これは、クラスに使われる特殊メソッドです。

この名前でメソッドを定義しておくと、print(インスタンス)やstr(インスタンス)といった関数を使ったときに、このメソッドの返り値が出力されます。


代表的な特殊メソッドは『__init__(self)』で、クラスをインスタンス化する時に実行されるメソッドですね。


代表的なモデルのフィールドクラス

代表的なフィールドクラスには以下のようなものがあります。

フィールドクラス説明
CharField短い文字列用のフィールド
「max_length」の指定が必須
TextField長い文字列用のフィールド
IntegerField整数のフィールド
PositiveIntegerField0と正の整数のフィールド
FloatField浮動小数点のフィールド
DateField日付のフィールド
DateTimeField日時のフィールド

データベースの操作

モデルコンポーネントの作成という意味では上の説明で一通り完了ですが、

ここではおまけとして、
データベースの操作方法について簡単に説明しておきます。

レコードの作成

レコードの作成は以下のようにコーディングします。

#レコードの作成方法

#自分で定義したモデルクラスをインポートする
from .models import User_data

#User_dataに値を渡してインスタンス化する
User_data_1 = User_data(name='Ichiro',age=30)

#.save()メソッドを実行してレコードを作成する
User_data_1.save()

レコードの取得

レコードの取得は以下のようにコーディングします。

#レコードの取得方法

#自分で定義したモデルクラスをインポートする
from .models import User_data

#主キー(1)のレコードを取得
#『id』の代わりに『pk』を使っても同じ動作をする。
User_data_1 = User_data.objects.get(id=1)

#フィールドの値を取得("Ichiro")
User_data_1.name

主キーとは:
レコードの新規作成時にDjangoが自動的に整理番号としての値を順番に付与する。その数字のこと。


レコードの更新

レコードの更新は以下のようにコーディングします。

#レコードの更新方法

#自分で定義したモデルクラスをインポートする
from .models import User_data

#主キー(1)のnameフィールドのレコードを’Jiro’へ更新
User_data_1 = User_data.objects.get(id=1)
User_data_1.name='Jiro'
User_data_1.save()

レコードの削除

レコードの削除は以下のようにコーディングします。

#レコードの削除方法

#自分で定義したモデルクラスをインポートする
from .models import User_data

#全レコードを削除
User_data_all = User_data.objects.all()
User_data_all.delete()

まとめ

今回は、モデルの作り方について簡単に説明しました。

モデルはデータベースとのやり取りをする重要なコンポーネントです。

基礎を理解してご自身のDango開発へ役立ててください!

ではまた次回。

参考書籍

この記事は下の書籍を参考にさせていただきました。

動かして学ぶ!Python Django開発入門(kindle版)

Djangoカテゴリの最新記事