フィールド
フィールド
DjangoのModelには様々なフィールドを追加することができます。
もともとDjangoに備わっているフィールドから、ライブラリからインストールした特殊な外部フィールドまで様々な型のデータを扱うことができます。
ここではそれぞれのフィールドを見ていきましょう。
各種フィールド
CharField
CharField
は文字列を扱うことができます。
文字列とは基本的には、短いテキストデータで、タイトルや名前などがこれにあたります。
CharField
では、最大文字数であるmax_length
を指定しなければいけないルールがあります。
例
title = models.CharField(max_length=100)
EmailField
EmailField
はCharField
と基本的に同じですが、メールアドレス専用に使用できるフィールドです。
これを使用すると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_now
とauto_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公式のドキュメントを参照すると良いでしょう。
Just Python フリープラン
ジャスパイなら教材は全て無料!