今日はDjangoのModel Fieldの一覧を紹介します。
多数あるModel Fieldですが、入れるデータの種類は決まってます。
数字、時間、文字列、画像などのデータの4つがメインになります。
この4つの中でも表示形式でさらに分けたものがEmailアドレス形式だったり、小数形式になります。
また、表示形式の中でも特殊なものもあります。
今日はこの数字、時間、文字列、データ、その他ごとに分け、中身に意訳も混じりつつ一覧を紹介していきます。
「数字」を入れるModel Field
整数
フィールド名 | 説明 | 属性 |
AutoField | 自動的に一つずつ増えるIntegerFieldです。 入力がなければ自動的にモデルに追加されます。 | **option |
IntegerField | -2147483648から2147483647までの整数が入ります。 フォームウィジェットはNumberInputかTextInputです。 | **option |
BigIntegerField | -9223372036854775808から92233720368547 75807までが入る。64bitの整数。 | **option |
SmallIntegerField | -32768から32767までが入る16bitの整数。 | **option |
AutoFieldはモデル内のオブジェクトに番号を割り振るためのフィールドです。
それ以外はIntegerFieldになりますが、BigやSmallも存在します。
これらの違いはフィールド内で扱える数字が違います。
「なら、一番多く使えるBigIntegerFieldでいいじゃん!」と思いますが、扱う数字が多くなると使用するストレージの量も多くなってきます。
扱う数字や保存するデータの量を考慮して決めましょう。
0と正の数
フィールド名 | 説明 | 属性 |
PositiveIntegerField | 0 ~ 2147483647のIntegerField (整数)です。 | **option |
PositiveBigIntegerField | 0 ~ 9223372036854775807のInteger Fieldです。 | **option |
PositiveSmallIntegerField | 0 ~ 32767 の IntegerFieldです。 | **option |
上記にある整数の負の数がないフィールドです。
各フィールドの違いは、整数の部分と同じ内容になります。
小数
フィールド名 | 説明 | 属性 |
FloatField | pythonのfloatインスタンスで表される浮動点小数です。 フォームウィジェットはNumberInputかTextInputです。 | **option |
DecimalField | pythonのdecimalインスタンスで表される10進数の小数です。 フォームウィジェットはNumberInputかTextInputです。 | max_digits decimal_places **option |
FloatとDecimalの違いは、Floatが2進数で、Decimalが10進数を使用していることです。
例えば、Floatが2進数で0.05を示すと、0.05 = (0/2+0/4+0/8+0/16+1/32+1/64+0/128+0/256+1/512+…)となり、キリよく表示することができないため誤差が生じます。
Decimalは10進数で表現をします。また、引数にあるmax_digitsとdecimal_placesで小数の切り捨てを設定できるため、Floatとは異なり数字の精度を高めることができます。
「時間」をいれるModel Field
日時
フィールド名 | 説明 | 属性 |
DateField | pythonのdatetime.dateインスタンスで表される日付です。 フォームウィジェットはDateInputです。 | auto_now auto_now_add **option |
DateTimeField | pythonのdatetime.datetimeインスタンスで表される日付と時刻です。 フォームウィジェットはDateTimeInputです。 | auto_now auto_now_add **option |
TimeField | pythonのdatetime.timeインスタンスで表される時刻です。 フォームウィジェットはTimeInputです。 | auto_now auto_now_add **option |
DateFieldでは日付のみ、DateTimeFieldは日付と時刻、TimeFieldは時刻のみのためのフィールドです。
ここでは特記するようなことはないです。
日時(期間)
フィールド名 | 説明 | 属性 |
DurationField | pythonのtimedeltaでモデル化される時刻の期間を保持します。 | **option |
「文字列」を入れるModel Field
文字
フィールド名 | 説明 | 属性 |
CharField | 一般的な文字列のフィールドです。 フォームウィジェットはtextinputです。 | max_length **option |
TextField | 大量の文字列に対するフィールドです。 フォームウィジェットはtextareaです。 | **option |
CharFieldとTextFieldは文字列のフィールドという意味では同じですが、TextFieldは文字数が制限されてないため、CharFieldと比べて読み出しや保存の効率が悪いです。
文字数が分かっている場合はCharFieldを使用した方が効率の良い設計になります。
Emailアドレス
フィールド名 | 説明 | 属性(デフォルト) |
EmailField | Emailか確認するEmailValidatorで 値をチェックするCharFieldです。 | max_length(=254) **option |
EmailFieldのmax_lengthはデフォルトとして254が設定されています。
254文字以上のEmailはないとは思いますが、注意すべき点です。
URL
フィールド名 | 説明 | 属性(デフォルト) |
URLField | URLValidatorで値をチェックするChar Fieldです。 フォームウィジェットでURLInputを使います。 | max_length(=200) **option |
SlugField | URLに使われるような文字(半角英字)、数字や アンダースコア、ハイフンを含む短い文です。 | max_length(=50) **option |
URLFieldのmax_lengthはデフォルトで200が設定されています。
SlugFieldのmax_lengthは50が設定されています。
SlugFieldはドメイン以降のURLの末端部分の保存に適しており、読み出し先としてはurls.pyなどに使用されることがあります。何がメリットかというと、保存したデータでページを作る時、SlugがあるとURLに保存したデータに適した文言を入れることができます。
ファイルパス
フィールド名 | 説明 | 属性(デフォルト) |
FilePathField | あるディレクトリ上のファイル名に限り選択肢とするCharFieldです。 | path(設定が必須) match(=None) recursive(=False) allow_files(=True) allow_folder(=False) max_length(=100) **option |
FilePathFieldのpathは設定が必須なものになります。例:path = “/home/images”のようなものです。
matchは正規表現を使用して、ファイル名をフィルタリングします。
例:”foo.*\.txt” では”foo23.txt”はOKですが、”bar.txt”や”foo23.png”はNGになります。
recursiveはpathで指定した先のディレクトリのサブディレクトリも含むかを指定します。
allow_filesとallow_folderは指定先ディレクトリのファイルやフォルダーを含むかを指定します。allow_filesとallow_folderのどちらかは”True”にする必要があります。
IPアドレス
フィールド名 | 説明 | 属性(デフォルト) |
GenericIPAddressField | IPv4かIPv6のアドレス用で文字列のフォーマットです。 フォームウィジェットはtextinputです。 | protocol(=both) unpack_ipv4(=false) **option |
UUID
フィールド名 | 説明 | 属性 |
UUIDField | pythonのUUIDクラスを使用し、UUIDを保持するフィールドです。 AutoFieldに代わるのに最適です。 | **option |
このUUIDFieldだけではUUIDを生成しないため、デフォルトの設定が必要です。
以下のようにデフォルトを書きましょう。
import uuid
from django.db import models
class MyUUIDModel(models.Model):
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
# other fields
「データ」が入るModel Field
フィールド名 | 説明 | 属性(デフォルト) |
FileField | ファイルをアップデートするフィールドです。 | upload_to(=None) max_length(=100) **option |
ImageField | FileFieldのメゾットと属性を引き継いでます。 また、アップロードされたデータが有効な画像か確認します。 | upload_to(=None) height_field(=None) width_field(=None) max_length(=100) **option |
FileFieldのupload_toはアップロードディレクトリとファイル名を設定する方法を提供します。
アップロードディレクトリを設定する場合は、upload_to=’uploads/’
ファイル名を設定する場合は、upload_to=’uploads/%Y/%m/%d/’となります。
ImageFieldにはPillowライブラリが必須になります。
また、2つ追加の属性としてheight_fieldとwidth_fieldがあります。
これで設定した高さと幅に画像の大きさを自動的に変更します。
ちょっと特殊なModel Field
フィールド名 | 説明 | 属性(デフォルト) |
BinaryField | バイナリーデータを入れるフィールドです。 | max_length(=None) **option |
BooleanField | True/Falseのフィールドです。 フォームウィジェットはCheckboxInputです。 | **option |
JSONField | JSONのデータを格納します。 データは辞書やリスト、文字列、数値などで表されます。 | encoder(=None) decoder(=None) **option |
Model Fieldの **option
今までフィールドを書いてきました。
それらの中には属性部分に**optionと書いてあります。
その**optionには以下の項目が全て入っています。
オプション | 説明 | |
**option | null | Trueの場合、空の値をNULLとして保存できます。 デフォルトはFalseです。 CharFieldやTextFieldで空の値を入れる場合はblankを推奨します。 |
blank | Trueの場合、フィールドはブランクになることができます。 デフォルトはFalseです。 | |
choices | リストやタプルで2つの要素を設定すると、選択肢として使用できます。 例:choices = [(1,’Alpha’),(2,’Beta’),…] | |
db_column | このフィールドを使用するためのデータベースのカラムの名前です。 もし与えられなければ、Django はフィールド名を使用します。 | |
db_index | Trueの場合、データベースインデックスがこのフィールドのために生成されます。 | |
db_tablespace | フィールドが索引される場合、データベース領域の名前となります。 | |
default | フィールドのデフォルト値を設定します。 | |
editable | Falseの場合、管理画面やModelFormに表示されないです。 デフォルトはTrueです。 | |
error_messages | 既存のエラーメッセージを無視して、表示するメッセージです。 | |
help_text | フォームウィジェットと共に表示される補助テキストです。値の中にHTMLを組み込むこともできます。 | |
primary_key | Trueの場合、設定したフィールドを帰属モデルの主キーにします。 モデル内のフィールドにprimary_key=Trueとして設定しない場合は、自動的にprimary_keyをもつフィールドを加えます。 | |
unique | Trueの場合、そのフィールドはテーブル上で一意となる制約を受けます。 | |
unique_for_date | DateFieldやDataTimeFieldにこれを設定すると、日付の値が一意になります。 | |
unique_for_month | unique_for_dateと同様ですが、月に対して一意になります。 | |
unique_for_year | unique_for_dateやunique_for_monthと同様で、年に関して一意になります。 | |
verbose_name | 人間が可読なフィールド名を設定します。 | |
validators | このフィールドに対して使用できるバリデータのリストです。 |
最後に
私自身が学び始めた頃、model fieldはわかりにくいと思っていたため、初心者向けになるべく分かりやすく、細かく書いてみました。
以上がModelのFieldの一覧でした。お付き合いいただきありがとうございます。
djangoをより学びたい場合の関連記事です。
djangoをレベル別で書籍を使用し、順序よく学びたい方におすすめの本を紹介している記事です。
djangoを初めて学ぶ初学の方から、基礎を学び終えた初級の方、アプリを作った・作っている中級の方の3種のレベルに分けておすすめの本を紹介しています。
また、動画で学びたい方はこちらの記事をおすすめします。
djangoをこれから学ぶ方から、アプリ開発したいけどやり方がわからない!って方におすすめです。
Udemyでおすすめな厳選django動画教材を紹介します。