フィールド

フィールド

DjangoのModelには様々なフィールドを追加することができます。
もともとDjangoに備わっているフィールドから、ライブラリからインストールした特殊な外部フィールドまで様々な型のデータを扱うことができます。
ここではそれぞれのフィールドを見ていきましょう。

各種フィールド

CharField

CharFieldは文字列を扱うことができます。
文字列とは基本的には、短いテキストデータで、タイトルや名前などがこれにあたります。
CharFieldでは、最大文字数であるmax_lengthを指定しなければいけないルールがあります。


title = models.CharField(max_length=100)

EmailField

EmailFieldCharFieldと基本的に同じですが、メールアドレス専用に使用できるフィールドです。
これを使用するとDjangoがデフォルトでメールアドレスのみを受け付けるようになります。例えば、データの中に@などがない場合にエラーを出してくれるようになります。


email = models.EmailField(max_length=100)

TextField

TextFieldは長文を扱うことのできるテキストフィールドです。
CharFieldと違って、最大文字数の制限をかける必要がなく、また改行を扱うデータなども扱いやすくなります。
わかりやすい例として、CharFieldはHTML上では input で表示されますが
TextFieldは textarea で表示されます。


body = models.TextField()

IntegerField

IntegerFieldは数値を扱うフィールドです。
その値は、-2147483648から2147483648までの数値を扱うことができます。


price = models.IntegerField()

SmallIntegerField

SmallIntegerFieldは小さな数値を扱うフィールドです。
その値は、-32767から32767までの数値を扱うことができます。


price = models.SmallIntegerField()

PositiveIntegerField

PositiveIntegerFieldは正の数値を扱うフィールドです。
0から2147483648までの数値を扱うことができます。


price = models.PositiveIntegerField()

PositiveSmallIntegerField

PositiveSmallIntegerFieldは正の数値を扱うフィールドです。
0から32767までの数値を扱うことができます。


price = models.PositiveSmallIntegerField()

BigIntegerField

BigIntegerFieldは大きな数値を扱うフィールドです。
その値は、-9223372036854775808から9223372036854775808までの数値を扱うことができます。


price = models.BigIntegerField()

FloatField

FloatFieldは小数点を含む数値を扱うことのできるフィールドです。
IntegerFieldは小数を扱うことができないので、値に小数点を含む可能性がある場合はこちらを使いましょう。


price = models.FloatField()

BooleanField

BooleanFieldは真偽値。つまりTrueとFalseを扱うことのできるフィールドです。
defaultを併用することが多いです。


is_published = models.BooleanField(default=False)

DateField

DateFieldは年月日を扱うフィールドです。
誕生日などの時間を含まないデータがこれに当たります。
時間に関するデータにはauto_nowauto_now_addをTrueに指定することができます。
auto_nowをTrueにするとデータが保存/更新されるたびにその時の時間を保存します。
auto_now_addをTrueにするとデータが初めて作成された時にその時間を保存します。


birthday = models.DateField()

DateTimeField

DateTImeFieldは日時を扱うフィールドです。
年から秒までの時間を取得するため、タイムスタンプなどに使われることが多いです。


created = models.DateTimeField(auto_now_add=True)
updated = models.DateTimeField(auto_now=True)

TimeField

TimeFieldは時間を扱うフィールドです。
時間のみを扱いたいときはTimeFieldを使いましょう。


time = models.TimeField()

FileField

FileFieldはファイルを扱うフィールドです。
正確には、このフィールドにファイルのURLパスを保存します。
実際のファイルはURLパス先にあるストレージやmediaフォルダに保存されます。
upload_toで保存先のパスを指定します。


file = models.FileField(upload_to='contents/file')

ImageField

ImageFieldは写真などのイメージファイルを扱うフィールドです。
正確には、このフィールドにファイルのURLパスを保存します。
実際のイメージファイルはURLパス先にあるストレージやmediaフォルダに保存されます。
upload_toで保存先のパスを指定します。


image = models.ImageField(upload_to='contents/image')

ForeignKey

ForeignKeyは別のデータベーステーブルを参照するフィールドです。
参照先のテーブルとは親子の関係になります。
つまり参照先のテーブルからは参照されているテーブルは複数存在する可能性がありますが、参照元(ForeignKeyを指定してあるテーブル)からは参照先は1つのみです。
これを多対1のリレーションといいます。

on_deleteを記述して、参照先のデータが削除された時のアクションを記入しなければいけません。


class Category(models.Model):

    name = models.CharField(max_length=100)


class Article(models.Model):

    title = models.CharField(max_length=100)
    category = models.ForeignKey(Category, on_delete=models.CASCADE)

この時一つのカテゴリ(Category)に対して、複数の記事(Article)が作成される可能性がありますが、一つの記事に複数のカテゴリはありえません。これが多対1のリレーションです。

on_delete

on_deleteは、参照先のデータが削除された時のアクションですが、主要なものを覚えておきましょう。

  • models.CASCADE
    参照先のデータが削除された時、参照元のデータも削除します。
  • models.SET_NULL
    参照先のデータが削除された時、参照元の指定のフィールドにnullを代入します。
  • models.PROTECT
    参照先のデータが削除された時、エラーを出して両方のデータが削除されるのを防ぎます。
OneToOneField

OneToOneFieldは別のデータベーステーブルを参照するフィールドです。
両テーブルから1つしか参照できないリレーションで、1対1のリレーションと言います。
テーブルを拡張したいときなどに使用されます。
こちらも参照しあうリレーションのため、on_deleteを使用します。


class Article(models.Model):

    title = models.CharField(max_length=100)


class ArticleInfo(models.Model):

    description = models.TextField()
    article = models.OneToOneField(Article, on_delete=models.CASCADE)

ManyToManyField

ManyToManyFieldは別のデータベーステーブルを参照するフィールドです。
参照先も参照元も複数存在する可能性があるため、多対多のリレーションと呼ばれます。
ForeinKeyが一つのフィールドで複数指定できると考えましょう。
参照先のデータが削除されても影響を受けないので、on_deleteを設定しません。


class Article(models.Model):

    title = models.CharField(max_length=100)


class ArticleGroup(models.Model):

    articles = models.ManyToManyField(Article)

この場合、ArticleGroupのarticlesには複数のArticleを登録することができます。
既に他のArticleGroupに登録されているArticleでも、他のArticleGroupに登録できるようにしたいとすると、ManyToManyFieldが最適な選択肢になります。

フィールド引数

フィールドには引数に制約や設定を書き込むことができます。
主要な引数の項目を見ていきましょう。

max_length

max_lengthは文字列のデータの最大文字数を指定することができます。
主にCharFieldに使用されます。


title = models.CharField(max_length=255)

verbose_name

verbose_nameはフィールド名を指定することができます。
またこの名前は、forms.pyを用いた時のラベル名としても使用されます。
全てのフィールドで使用することができます。
特にフィールド名はデフォルトで英語になるので、明示的に日本語に変えておくと良いでしょう。


title = models.CharField(verbose_name='タイトル')

upload_to

upload_toはファイルを扱うFileFieldや写真などを扱うImageFieldで主に使用されます。
ここで指定したパスに実際のファイルを保存することができます。
例では、contents/image 配下に写真ファイルを保存します。


image = models.ImageField(upload_to='contents/image')

null

nullはnull値を許容するかどうかを設定できます。
例えば、既に作成済みのテーブルにフィールドを追加する場合、
既に作成されているデータには新しく作られるフィールドに情報が何もありません。
この時、nullをTrueにすることでテーブル(Class)の更新をすることができます。


sub_title = models.CharField(null=True)

blank

blankはフィールドに空白を許容するかどうかを設定できます。
通常、フィールドには空白の値は許容されませんが、blankをTrueにすることで
値が空のフィールドを作成することができます。


sub_title = models.CharField(blank=True)

default

defaultはフィールドが作成された時に、登録される値が存在しない場合のデフォルト値を設定することができます。


sub_title = models.CharField(default='サブタイトル')

フィールドやフィールド引数はこれだけに留まりません。
もっと知りたい場合は、Django公式のドキュメントを参照すると良いでしょう。