Django モデル層


このページは[Django公式サイト](http://docs.djangoproject.jp/en/latest/index.html)並びに、[DjangoGirlsチュートリアル](https://djangogirlsjapan.gitbooks.io/workshop_tutorialjp/content/)を参考にしてまとめています。
記事者環境：Win10　Python3.5.1 Djangof1.11.8



モデルは、保存したいデータを表すデータを表すデータフィールドと、挙動を定義します。
通常、１つのモデル　＝　１つのデータベーステーブルに対応しています。

# モデルの基本
・アプリディレクトリ内に生成される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チュートリアル（２）で説明します）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**
固定精度の１０進少数です。PythonのDecimal型インスタンスとして表現されます。
必須の引数は２つあります。**max_digits**最大桁数　**decimal_places**少数部の保存に使われる桁数。
例えば、小数部が２桁で９９９までの数を表現できるようにするためには、
`models.DecimalField(..., max_digits=5, decimal_places=2)`
とします。

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

**FileField**
ファイルアップロードのためのフィールドです
必須の引数は１つ　**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フィールドとそれを含むモデルの名前を使って生成されます。
  データベースによっては、一定の長さを超えるテーブル名をサポートしていないため、テーブル名が長すぎる場合は自動的に６４文字に切り詰めてさらにハッシュ値を使って一意な名前を付けます。

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

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

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

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