モデル定義の基本
モデルクラスを作成し、データベースのテーブル構造を定義します。
フィールドタイプ 📚
モデルで使用できる主要なフィールドタイプです。
フィールドタイプ | 説明 | 主な引数 |
---|---|---|
CharField |
短い文字列(必須: max_length ) |
max_length , db_collation |
TextField |
長いテキスト文字列 | db_collation |
IntegerField |
整数 | |
PositiveIntegerField |
正の整数 | |
SmallIntegerField |
小さい範囲の整数 | |
BigAutoField |
64ビット整数(自動インクリメント主キー用) | primary_key=True |
AutoField |
32ビット整数(自動インクリメント主キー用、古いDjangoバージョンでのデフォルト) | primary_key=True |
FloatField |
浮動小数点数 | |
DecimalField |
固定精度の10進数(必須: max_digits , decimal_places ) |
max_digits , decimal_places |
BooleanField |
真偽値 (True/False) | default |
NullBooleanField |
真偽値 (True/False/Null) ※非推奨、BooleanField(null=True) を使用 |
|
DateField |
日付 (YYYY-MM-DD) | auto_now , auto_now_add |
DateTimeField |
日時 (YYYY-MM-DD HH:MM:SS) | auto_now , auto_now_add |
TimeField |
時刻 (HH:MM:SS) | auto_now , auto_now_add |
DurationField |
期間(Pythonのtimedelta ) |
|
EmailField |
メールアドレス形式の文字列 | max_length |
URLField |
URL形式の文字列 | max_length |
UUIDField |
UUID | default=uuid.uuid4 , editable=False |
FileField |
ファイルアップロード | upload_to , storage |
ImageField |
画像ファイルアップロード(FileField を継承、Pillowが必要) |
upload_to , storage , height_field , width_field |
JSONField |
JSON形式のデータを格納(一部DBのみネイティブ対応) | encoder , decoder |
GenericIPAddressField |
IPv4またはIPv6アドレス | protocol , unpack_ipv4 |
BinaryField |
生のバイナリデータ | max_length |
フィールドオプション ⚙️
フィールド定義時に指定できる共通のオプションです。
オプション | 説明 | デフォルト値 |
---|---|---|
null |
データベースレベルでNULL値を許可するかどうか (True /False )。文字列ベースのフィールド(CharField, TextField)では非推奨。 |
False |
blank |
フォームでの入力が空であることを許可するかどうか (True /False )。バリデーションに関係。 |
False |
default |
フィールドのデフォルト値。値そのものか、呼び出し可能オブジェクトを指定。 | 指定なし |
choices |
選択肢を提供する。タプルのタプル (('DB値', '表示名'), ...) または Enum を指定。指定するとフォームでは通常セレクトボックスになる。 |
指定なし |
verbose_name |
フィールドの人間可読な名前。Django Adminなどで表示される。 | フィールド名をスペース区切りにしたもの |
help_text |
フィールドの説明文。フォームやDjango Adminで表示される。 | '' (空文字列) |
primary_key |
このフィールドをモデルの主キーにするか (True /False )。 |
False |
unique |
テーブル内でこのフィールドの値が一意である必要があるか (True /False )。 |
False |
unique_for_date |
指定された日付フィールド(DateField /DateTimeField )に対して、このフィールドの値が一意である必要があるか。フィールド名を文字列で指定。 |
指定なし |
unique_for_month |
指定された日付フィールドの「月」に対して、このフィールドの値が一意である必要があるか。 | 指定なし |
unique_for_year |
指定された日付フィールドの「年」に対して、このフィールドの値が一意である必要があるか。 | 指定なし |
db_index |
このフィールドにデータベースインデックスを作成するか (True /False )。検索パフォーマンス向上のため。 |
False |
db_column |
データベースで使用するカラム名を指定。省略するとフィールド名が使われる。 | フィールド名 |
db_tablespace |
フィールドのインデックスで使用するデータベーステーブルスペース名を指定(DBが対応している場合)。 | プロジェクト設定のDEFAULT_INDEX_TABLESPACE |
editable |
Django Admin や ModelForm でこのフィールドが編集可能か (True /False )。False にすると表示されない。 |
True |
error_messages |
デフォルトのエラーメッセージを上書きするための辞書。キーは null , blank , invalid , invalid_choice , unique , max_length など。 |
指定なし |
validators |
フィールドに適用するバリデーター関数のリスト。 | [] (空リスト) |
auto_now (DateField/DateTimeField/TimeField) |
モデルが保存されるたびに、現在の日時に自動的に設定される (True /False )。編集不可(editable=False )かつ空不可(blank=False )になる。 |
False |
auto_now_add (DateField/DateTimeField/TimeField) |
モデルが最初に作成されたときに、現在の日時に自動的に設定される (True /False )。編集不可(editable=False )かつ空不可(blank=False )になる。 |
False |
upload_to (FileField/ImageField) |
ファイルのアップロード先ディレクトリ。文字列または関数を指定可能。日付フォーマット('%Y/%m/%d/' )が利用できる。 |
指定なし (必須に近い) |
リレーションシップ 🤝
モデル間の関連性を定義します。
Meta オプション 🔧
モデルクラス内に Meta
クラスを定義して、モデルの挙動を設定します。
オプション | 説明 |
---|---|
db_table |
データベースで使用するテーブル名を明示的に指定。デフォルトは アプリ名_モデル名小文字 。 |
ordering |
モデルのデフォルトの並び順を指定。フィールド名のリストまたはタプル。'-fieldname' で降順。'?' でランダム。 |
verbose_name |
モデルの人間可読な単数名。Django Adminなどで使用。 |
verbose_name_plural |
モデルの人間可読な複数名。デフォルトは verbose_name + 's' 。 |
unique_together |
複数のフィールドの組み合わせで一意制約を設定。タプルのタプル (('field1', 'field2'), ...) 。※Django 4.1以降は非推奨、constraints の UniqueConstraint を使用。 |
index_together |
複数のフィールドにまたがるインデックスを作成。タプルのタプル (('field1', 'field2'), ...) 。※Django 4.1以降は非推奨、indexes を使用。 |
indexes |
データベースインデックスを定義。models.Index(fields=['field1', 'field2'], name='my_index') のリスト。 |
constraints |
データベース制約を定義。models.UniqueConstraint(fields=['field1', 'field2'], name='unique_fields') や models.CheckConstraint(check=Q(age__gte=18), name='age_gte_18') のリスト。 |
get_latest_by |
Manager.latest() や earliest() でデフォルトで使用するフィールド名(通常はDateField/DateTimeField)。 |
order_with_respect_to |
指定したフィールド(通常はForeignKey)を基準にオブジェクトを並び替え可能にする。モデルに _order フィールドが追加され、get_RELATED_order() , set_RELATED_order() メソッドが追加される。 |
abstract |
True にすると、このモデルは抽象基底クラスとなり、データベーステーブルは作成されない。他のモデルに継承させて共通フィールドを定義するのに使う。 |
managed |
False にすると、Djangoのマイグレーションはこのモデルのテーブルを作成・変更・削除しない。既存のDBテーブルやビューに対してモデルを定義する場合などに使用。デフォルトは True 。 |
proxy |
True にすると、このモデルは他のモデルのプロキシとなる。元のモデルと同じテーブルを使用するが、Pythonレベルでの挙動(デフォルトマネージャ、メソッドなど)を変更できる。 |
app_label |
モデルが属するアプリケーションを明示的に指定。INSTALLED_APPS に含まれていないアプリのモデルを定義する場合などに使用。 |
db_tablespace |
モデルのテーブルが使用するデフォルトのデータベーステーブルスペース名を指定。 |
required_db_features |
このモデルが必要とするデータベース機能のリスト。指定された機能が接続中のDBでサポートされていない場合、マイグレーションなどでエラーが発生する。例: ['gis_enabled'] |
required_db_vendor |
このモデルが動作する特定のDBベンダーを指定 ('sqlite' , 'postgresql' , 'mysql' , 'oracle' )。指定外のDBではエラー。 |
from django.db import models
from django.db.models import Q, CheckConstraint, UniqueConstraint, Index
class Product(models.Model):
name = models.CharField(max_length=100)
price = models.DecimalField(max_digits=10, decimal_places=2)
stock = models.PositiveIntegerField()
added_date = models.DateTimeField(auto_now_add=True)
class Meta:
db_table = 'product_catalog' # テーブル名を指定
ordering = ['-added_date', 'name'] # 追加日の降順、次に名前の昇順で並び替え
verbose_name = '商品'
verbose_name_plural = '商品リスト'
indexes = [
models.Index(fields=['name']), # nameフィールドにインデックス
]
constraints = [
models.UniqueConstraint(fields=['name'], name='unique_product_name'), # nameフィールドに一意制約
models.CheckConstraint(check=Q(price__gte=0), name='price_non_negative'), # priceが0以上である制約
]
データベース操作 (QuerySet API) 🔍
モデルマネージャ (objects
) を通じてデータベースにアクセスします。
高度なクエリ 🧠
より複雑なデータベース問い合わせ方法です。
モデルマネージャ (Managers) 🧑💼
モデルのテーブルレベルの操作(主にクエリ)を提供するインターフェース。
モデルメソッド 🛠️
個々のモデルインスタンスに対するカスタム操作を定義します。
マイグレーション 🔄
モデルの変更をデータベーススキーマに反映させる仕組み。
コメント