Edited at

Django モデル層

More than 1 year has passed since last update.

このページはDjango公式サイト並びに、DjangoGirlsチュートリアルを参考にしてまとめています。

記事者環境:Win10 Python3.5.1 Djangof1.11.8

モデルは、保存したいデータを表すデータを表すデータフィールドと、挙動を定義します。

通常、1つのモデル = 1つのデータベーステーブルに対応しています。


モデルの基本

・アプリディレクトリ内に生成されるmodels.pyが基本ファイルです。

・各モデルはPythonのクラスで、django.db.models.Model のサブクラスです。

・モデルの各アトリビュートの値は、データベース上のあるフィールドを表現します。

・モデルの情報をもとに、DjangoはデータベースAPIを自動生成します。


モデルの定義

例(Django公式サイト:

from django.db import models

class Person(models.Model):
first_name = models.CharField(max_length=30)
last_name = models.CharField(max_length=30)

上記のモデルでDBを作成した場合(作成方法はDjangoチュートリアル(2)で説明します)DBのテーブルはアプリ名_personとなり、カラムはfirst_name のvarchar(30) とlast_nameのvarchar(30)となります。

*テーブル名は上記のように、生成されますが、テーブル名を変更する事も可能です。オーバーライドしたい場合は、class Meta に db_table パラメタを設定します。

*idは自動的に追加れますが、この動作も変更できます。特定のフィールドを主キーにしたければ、フィールドのオプションに primary_key=True を指定してします。 Field.primary_key の設定されたフィールドの定義があれば、Django は id カラムを自動的に追加しません。各モデルには必ず一つ primary_key=True のフィー ルドが必要です。


モデルを使う

モデルを定義したら、そのモデルを使うようDjangoに指示する必要があります。

settings.pyを開いて以下のように書きます。

INSTALLED_APPS = (

#...
'プロジェクト名.アプリ名',
#...)


組み込みのフィールドクラス

null

Trueにすると、Djangoは空の値をNULLとしてデータベースに入れます。

デフォルト値はFaleです。

空の文字値はNULLではなく、空文字列として保存されます。

null=Trueが使えるのは、整数型、ブール型、日付のような文字列ではないフィールド型の場合だけです。

blank

Trueにすると、フィールドの値を空白(blank)にできます。デフォルト値はFalseです。

nullとは違います。nullが純粋にデータベース上の表現に関わる概念であるのに対し、blankとは値の検証(validation)に関わる概念です。あるフィールドにblank=Trueを指定すると、Djangoのadminサイト上で、空の値のエントリを作成できます。blank=Falseにすると、そのフィールドには必ず値を入れねばなりません。

choices

要素のタプルうからなるiterable(リストまたはタプル)を、フィールドの選択肢にします。

この値を指定すると、DJangoのadminには標準的なテキストフィールドの代わりに選択ボックスが表示され、指定された選択肢だけをえらべます。

YEAR_IN_SCHOOL_CHOICES = (

('FR', 'Freshman'),
('SO', 'Sophomore'),
('JR', 'Junior'),
('SR', 'Senior'),
('GR', 'Graduate'),
)

タプル[0]の値は、データベースに実際に保存される値になります。

タプル[1]の値は人間可読な名前です。

モデルクラスでの指定方法は以下の通りです。

gender = models.CharField(max_length=1, choices=GENDER_CHOICES)

choicesのタプルは、モデルクラスの中でも外でも定義可能です。

db_column

フィールドに使うデータベースカラム名です。この値を指定しなければ、Djangoはフィールド名を使います。(SQLの予約語やPythonで変数名として使えない文字を含んでいる場合も問題ありません。)

default

フィールドのデフォルト値です。この値は、何らかの値でも、呼び出し可能オブジェクトでもかまいません。呼び出し可能オブジェクトの場合、新たなオブジェクトが生成されるたびに呼び出されます。

editable

Falseにするとadmin上や、モデルクラスから生成したフォームの上でフィールドの値を編集できなくなります。デフォルト値はTrueです。

help_text

adminフォームの下に表示される、追加のヘルプテキストです。

この値はadminのインタフェース上に表示されるときにHTMLエスケープされないので、注意してください。必要な場合はHTMLを含める事も可能です。

primary_key

Trueに指定すると、フィールドをモデルの主キーにします。

指定をしない場合は、自動的にIntegerFieldを追加して主キーを保存します。

unique

Trueであれば、フィールドはテーブル全体でユニークな値しか指定できなくなります。

重複した値を持つモデルを保存しようとすると、保存時にエラーが送出されます。

unique_for_date

DateFieldやDateTimeField型のフィールドの名前を指定しておく、

そのフィールドの日付に対してユニークな値になるように制約します。

unique_for_month* *unique_for_year

フィールドの値が月、年ごとにユニークな値になるように制約します。

varbose_name

admin上で表示されるカラムの項目名称となります。


フィールドの型

AutoField

IntegerFieldの一種で、利用可能なIDの中から自動的にインクリメントしています。通常はこのフィールドが直接必要になる事はありません。

BigIntegerField

-9223372036854775808から9223372036854775807までの数値に適合することが保証されている以外は、IntegerFieldとよく似た64ビット整数です。

BooleanField

真偽(True/False)値を表すフィールドです。

adminではこのフィールドはチェックボックスとして表現されます。

CharField

文字フィールドで、短い文字列からやや長いものに適しています。

大量のテキストを入れたい場合には、TextFieldを使います。

charFieldを利用する場合は、必須でmax_lengthの引数を指定します。

CommaSeparatedIntegerField

カンマで区切った整数からなるフィールドです。CharFieldと同じくmax_length引数が必須です。

DateField

日付フィールドです。

オプションの引数がいくつかあります。

auto_nowはオブジェクトを保存するたびに、その時の時刻を自動的に設定します。この値は常に現在の日付になるので注意してください。

auto_now_addはオブジェクトを生成した時の時刻を自動的に設定します。常に現在の日付になるので注意してください。

DateTimeField

日付と時刻のフィールドです。DateFieldと同じオプションをとります。

DecimalField

固定精度の10進少数です。PythonのDecimal型インスタンスとして表現されます。

必須の引数は2つあります。max_digits最大桁数 decimal_places少数部の保存に使われる桁数。

例えば、小数部が2桁で999までの数を表現できるようにするためには、

models.DecimalField(..., max_digits=5, decimal_places=2)

とします。

EmailField

値が有効なメールアドレスであることをチェックするCharFieldです

FileField

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

必須の引数は1つ upload_to ローカルのファイルシステム上のパスです。

ImageField

FileFIeldの属性とメソッドをすべて継承し、さらにアップロードされたオブジェクトが有効なイメージかどうか検証します。

IntegerField

整数です。

IPAddressField

IPアドレスを文字列形式で表したものです。

NullBooleanField

BooleanFieldと同じですが、NULLを選択肢に使えます。null=TrueのBooleanFieldの代わりに使えます。adminでは「不明(Unknown) はい(Yes)いいえ(No))の選択肢をもつセレクトボックスで表現されます。


リレーションフィールド

ForeignKey

多対一のリレーションです。必須の固定引数として、リレーションを張るモデルのクラスをとります。

class Car(models.Model):

manufacturer = models.ForeignKey('Manufacturer')
# ...

class Manufacturer(models.Model):
# ...

他のアプリケーションのモデルを参照したい場合は、以下のように明示的に指定します。

  class Car(models.Model):

manufacturer = models.ForeignKey('production.Manufacturer')

limit_choices_to

データベースの照合オプションと値を対応づけた辞書でadminで選択肢を表示するときに、表示するオブジェクトを絞り込むために使えます。

related_name

リレーション策のオブジェクトから逆参照するときに使われる名前です。

to_field

リレーション先のオブジェクトの、リレーションを張る対象のフィールド名です。デフォルトではリレーション先のオブジェクトの主キーを使います。

ManyToManyField

多対多のリレーションを表現します。フォルトの設定では、テーブル名はmany-to-manyフィールドとそれを含むモデルの名前を使って生成されます。

データベースによっては、一定の長さを超えるテーブル名をサポートしていないため、テーブル名が長すぎる場合は自動的に64文字に切り詰めてさらにハッシュ値を使って一意な名前を付けます。

symmetrical

自分自身へのManyToManyFieldを定義するときにのみ使います。

through

Djangoは多対多を管理するテーブルを自動的に作成しますが、中間テーブルを独自に適宜したい場合はthroughオプションを使って、中間テーブルの表現に使いたいモデルを指定します。

このオプションは多対多の関係に追加のデータを持たせたい時につかいます。

db_table

多対多のリレーション情報を保存するために作成されるテーブルの名前です。指定しなければデフォルトの名前を使います。

OneToOneField

一対一のリレーションです。概念的にはForeignKeyに似ていますが、リレーションの「逆」をたどったときに、単一のオブジェクトを返す点が違います。