#python
#django
#DjangoGirls

このページは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に似ていますが、リレーションの「逆」をたどったときに、単一のオブジェクトを返す点が違います。