【django】モデルのフィールドについて:フィールドの型・オプション一覧

時計 2021.06.12 / 時計

【django】モデルのフィールドについて:フィールドの型・オプション一覧

本記事ではdjangoモデルにおける、フィールド(フィールドの型・フィールドオプション)について詳しく解説していきます。

djangoではmodels.py内でモデル定義を行い、このモデルを通してデータベース操作を行います。

モデル定義では、必ず一つ以上のフィールドを定義しますが、このフィールドで躓く人が多いように感じます。
私自身も初めの頃は、このフィールドについてよく理解しないままWebアプリケーション開発を行っていました。

ですがフィールドについての知識が身についてくると、フィールド定義の重要性がよくわかり、もっと初めから理解しておけばよかったと後悔したものです。

まだ完全にフィールドについて理解していない方は、ぜひ本記事でフィールドの理解を深めていただき、今後のWebアプリケーション開発に活かしてください。

本記事を通して以下の知識を学べます。

学べる知識
  • フィールドの基本
  • フィールドの型とその使い方
  • 共通して指定できるフィールドオプション

フィールド

フィールドとは

フィールドとは、モデル定義で必ず1つ以上必要となる項目です。
データベースで言うと、テーブルのカラムにあたります。

フィールドはモデルクラスの属性として定義されます。

データベースで言うテーブルは、モデルにあたります。
このモデルを通してデータベースの操作(追加、削除、更新)を行います。

つまりDjangoでは、モデルを使うことでSQL文(CREATEやINSERT)を使わないでデータベース操作を可能にします。

フィールドの定義

フィールドは次のように定義します。

フィールド名 = models.フィールドの型(フィールドオプション)

実際の例として、Personモデルを定義すると次のようになります。

from django.db import models

class Person(models.Model):
    first_name = models.CharField(blank=True, max_length=50)
    last_name = models.CharField(blank=True, max_length=50)

注意点として、models APIで使用されている名前(saveやclean、deleteなど)は、フィールド名として使うことができません。

フィールドの型(フィールドタイプ)とフィールドオプションは種類が多いため、躓く方が多い項目でもあります。

django:モデルのフィールドについて

作成するWebアプリケーションのテーブル(カラム)に合わせて、フィールドの型とフィールドオプションを選択します。

フィールドの型:一覧

フィールドを定義する際に、そのフィールドの型を指定する必要があります。

このフィールドの型は、データベースに保存されるカラムデータの型(INTEGER、VARCHARなど)を表します。

フィールドの型によって、Webアプリケーションのフォームで出力されるHTMLのinputタグのtype属性は変化します。

Djangoには以下のように様々なフィールドの型が用意されています。

フィールドの型 扱うデータ
BooleanField TrueまたはFalse
CharField 文字列
SlugField 文字列(制限あり)
IntegerField 整数
PositiveIntegerField 正の整数
TextField 長い文字列
DateField 日付
DateTimeField 日時
FileField ファイルアップロード
ImageField 画像
URLField URL
EmailField メールアドレス
GenericIPAddressField IPアドレス

BooleanField:ブール値(真偽)

TrueまたはFalseを保存するフィールドです。

models.BooleanField(**options)

主にチェックボックスなどで使われます。

HTMLのinputタグ属性はcheckboxです。

サンプルコード

from django.db import models

class Person(models.Model):
    first_name = models.CharField(blank=True, max_length=50)
    last_name = models.CharField(blank=True, max_length=50)
    paid_member = models.BooleanField()

CharField:文字列

文字列を保存するためのフィールドです。

models.CharField(max_length=None, **options)

文字数制限を表すフィールドオプションのmax_length(最大文字数)は必須です。
指定しない場合、以下のエラーが発生します。

CharFields must define a 'max_length' attribute.

max_length(最大文字数)は255まで指定可能です。

大量のテキストを保存する場合は、TextFieldを代わりに使います。

HTMLのinputタグ属性はtextです。

サンプルコード

from django.db import models

class Person(models.Model):
    first_name = models.CharField(blank=True, max_length=50)
    last_name = models.CharField(blank=True, max_length=50)
    paid_member = models.BooleanField()

SlugField:文字列(制限あり)

文字列がアルファベット、数字、アンダーバー、ハイフンを組み合わせた文字列を保存できるフィールドです。

SlugField(max_length=50, **options)

上記以外の文字が入った場合はエラーを発生します。

オプションmax_lengthがデフォルトで指定してありますので、わざわざオプションで指定する必要がありません。

IntegerField:整数

整数を保存するためのフィールドです。

field_name = models.IntegerField(**options)

-2,147,483,648から2,147,483,647までの数値をサポートします。

HTMLのinputタグ属性はnumberです。

サンプルコード

from django.db import models

class Person(models.Model):
    first_name = models.CharField(blank=True, max_length=50)
    last_name = models.CharField(blank=True, max_length=50)
    paid_member = models.BooleanField()
    age = models.IntegerField(blank=True, null=True)

PositiveIntegerField:正の整数

0または正の整数を保存するためのフィールドです。

Models.PositiveIntegerField(**options)

IntegerFieldと同じように使用できますが、違う点としては正の値または0のみ対応している点です。

TextField:テキスト

長い文字列(テキスト)を保存するためのフィールドです。
CharFieldでは保存できない長さの文字列を保存する場合、こちらのフィールドを使います。

models.TextField(**options)

保存するテキストサイズに制限がないので、ブログなどに最適なフィールドです。
またCharFieldとは異なり、フィールドオプションmax_lengthの指定は必要ありません。

HTMLの出力はtextareaタグです。

サンプルコード

from django.db import models

class Person(models.Model):
    first_name = models.CharField(blank=True, max_length=50)
    last_name = models.CharField(blank=True, max_length=50)
    paid_member = models.BooleanField()
    memo = models.TextField(blank=True)

DateField:日付

日付データを保存するためのフィールドです。
この日付はdatetime.dateインスタンスによって表される日付になります。

DateField(auto_now=False, auto_now_add=False, **options)

オプションauto_nowをTrueにすると、そのオブジェクトが変更される度に自動的に現在の日付が保存されます。

オプションauto_now_addをTrueにすると、オブジェクトが最初に作成されたときに自動的に現在の日付が保存されます。

オプションauto_nowとauto_now_addは共にデフォルトがFalseです。

これらオプションは、ほぼすべてのテーブルで追加する作成日時フィールド(created_at)と更新日時フィールド(updated_at)で使われます。

created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)

またこれらオプションのデメリットとして、管理サイトの詳細画面で表示されないことです。
理由はeditableオプションが自動的にFalseとなっているためです。

DateTimeField:日時

日付と時刻を保存するためのフィールドです。
この日付と時間はdatetime.datetimeインスタンスによって表される日付と時刻になります。

DateTimeField(auto_now=False, auto_now_add=False, **options)

引数のauto_nowとauto_now_addは、DateFieldのそれと同じです。

TimeField:時刻

時刻を保存するためのフィールドです。

TimeField(auto_now=False, auto_now_add=False, **options)

時刻はdatetime.timeによって表される時刻です。

FileField:ファイルアップロード

ファイルをアップロードするためのフィールドです。

FileField(upload_to=None, max_length=100, **options)

FileFieldを使う場合は、MEDIA_ROOTの設定を行う必要があります。

ImageField:画像

画像をアップロードするためのフィールドです。

ImageField(upload_to=None, height_field=None, width_field=None, max_length=100, **options)

ImageFieldは画像アップロード時にチェックを行うため、画像をアップロードする際はFileFieldではなくImageFieldを使いましょう。

URLField:URL

URLを保存するためのフィールドです。

URLField(max_length=200, **options)

URLを保存するためのCharFieldであり、デフォルトでmax_lengthが指定されています。

EmailField:メールアドレス

メールアドレスを保持するためのフィールドです。

EmailField(max_length=254, **options)

入力された値に@(アットマーク)がないとエラーが発生する仕組み(バリデーション)になっています。

このフィールドではmax_lengthがデフォルトで設定されています。
そのためmax_lengthをオプションで指定する必要がありません。

GenericIPAddressField:IPアドレス

IPv4またはIPv6のアドレスを保存するためのフィールドです。

GenericIPAddressField(protocol=’both’, unpack_ipv4=False, **options)

フィールドオプション(共通)

各フィールドで共通して指定できるフィールドオプションもたくさん用意されています。

以下に共通して指定できるフィールドオプションの一覧を記します。

フィールドオプション 使い方
blank 入力を必須にするかどうか
null データベースのnullを許容するかどうか
unique データベース上で一意制約を設定
choices セレクトボックスを作成
verbse_name 管理画面でのフィールド名表示を変更させる
default デフォルト値の設定
primary_key プライマリーキーの設定

blankとnull

blankとnullは同じような機能を持っていると思われがちですが、全く異なるオプションです。

フィールドオプションblankは、Webサイト上のフォームからデータを送信する際、そのフィールドの入力を必須にするかどうかを指定します

フィールドオプションnullは、データをデータベースに登録する際、そのフィールドのデータが空でも登録するかどうかを指定します。

blankはサイトの入力フォーム、nullはデータベースと覚えるとわかりやすいと思います。

これらの違いについては以下記事で詳しく解説しています。

unique

オプションuniqueでTrueを指定すると、そのフィールド(カラム)はデータベース上で一意制約を受けるようになります。

choices

オプションchoicesを使うことで、選択をセレクトボックスにすることができる。

LANGUAGE_CHOICES = [
   ('English', 'ENGLISH'),
   ('Japanese', 'JAPANESE')
]
class Post(models.Model):
   title = models.CharField(max_length=255)
   category = models.CharField(max_length=30, choices=CATEGORY_CHOICES)
   body = models.TextField()

タプルの第一要素はデータベースに登録されるデータ、第二要素はセレクトボックスで表示される内容です。

verbose_name

フィールドにオプションverbose_nameを指定することで、管理画面上でのフィールド名を指定した文字列にすることができます。

class Meta中にもverbose_nameは指定することができ、その場合は管理画面上のテーブル名を指定した値にできます。

より詳しい使い方に関しては、以下の記事をご参照ください。

default

オプションdefaultでそのフィールドのデフォルト値を指定することができます。

primary_key

オプションprimary_keyをTrueにすると、そのフィールドをテーブル(モデル)の主キーにできます。

モデル内に主キーをフィールドに設定しなかった場合は、自動的に以下のIntegerFieldが追加されます。

id = models.AutoField(primary_key=True)

モデル内には1つ以上のprimary_keyが必要なため、モデル内に主キーフィールドがないと上記のidフィールドが自動追加されるのです。

まとめ

本記事「【django】モデルのフィールドについて:フィールドの型・オプション一覧」はいかがでしたか。

モデルのフィールドは、djangoを学習する際、始めの頃に学ぶ項目です。
しかしdjangoの中でも非常に重要な項目の一つです。

フィールドをしっかり理解してから、Webアプリケーション開発を進めてください。