モデルの作成
モデルの作成はアプリフォルダーのmodels.pyに記述します。
ここではUserモデルを作成し、名前とメールアドレスのフィールドを持たせたいと思います。
from django.db import models
class User(models.Model):
name = models.CharField(max_length=20)
email = models.EmailField()
class Meta:
db_table = 'user'
def __str__(self):
return self.name
・Userクラスを作成し、modelsのModelクラスを継承します。
名前のフィールドには文字列を入れたいのでmodels.CharField
を指定し、メールアドレスにはmodels.EmailField
を指定する事で自動的にメールアドレスとして正しい値か判断してくれます。
・nameフィールドには入力できる文字数に制限を入れたいのでmax_length=20
とし、20文字以内で入力できるようにします。
・class Meta
の部分でテーブル名を「user」に指定しています。
・def __str__(self)
では管理画面などで表示されるデータの名前をユーザー名に変更しています。
データの取得
データベースからデータを取得する方法
#全てのデータ取得
User.objects.all()
#idを指定して一件だけ取得
User.objects.get(pk=1)
#フィルターしたデータを取得
User.objects.filter(name='大谷').all()
#データのフィールドを取得
user = User.objects.get(pk=1)
user.name
一対多のモデル作成
Teamモデルを作成し、Userモデルと一対多の関係を作ります。
「一つのチームに複数のユーザーが所属している」という関係になります。
class User(models.Model):
name = models.CharField(max_length=20)
email = models.EmailField()
team = models.ForeignKey('Team', on_delete=models.CASCADE)
class Meta:
db_table = 'user'
def __str__(self):
return self.name
class Team(models.Model):
name = models.ChaField(max_length=30)
class Meta:
db_table = 'team'
一対多を作成するのはUser(一の方)にmodels.ForeignKey
を指定し、引数にTeam(多の方)とon_delete
でTeamが削除された場合の処理を指定します。
CASCADE:親オブジェクトが削除されると、そのオブジェクトに紐づいた子オブジェクトも削除される
PROTECT:親オブジェクトに紐づいた子オブジェクトがある場合、親オブジェクトを削除できない
SET_DEFAULT:親オブジェクトが削除された場合、デフォルトオブジェクトに子オブジェクトが紐づく
SET_NULL:親オブジェクトが削除された場合、NULLが設定される
上記以外にも設定可能な値があるので作成するアプリに合わせて適切に設定します。
データ取得
#UserからTeamを参照
user = User.objects.get(pk=1)
user.team.name
#TeamからUserを取得
team = Team.objects.get(pk=1)
users = team.users_set.all()
#User名とチーム名のor条件で絞り込み(Qをインポート)
from django.db.models import Q
User.objects.filter(Q(name='大谷') | Q(team__name='TeamA').all())
#AND条件
User.objects.filter(name='大谷', team__name='TeamA').all()
#チーム内のユーザーを絞り込み
team = Team.objects.get(pk=1)
team.users_set.filter(name='大谷')
多対多のモデル作成
TeamとUserを多対多の関係にしてみましょう
「複数のチームがあり、ユーザーは複数のチームに所属することができる」という関係になります。
class User(models.Model):
name = models.CharField(max_length=20)
teams = models.ManyToManyField(Teams)
class Meta:
db_table = 'user'
def __str__(self):
return self.name
class Teams(models.Model):
name = models.CharField(max_length=30)
class Meta:
db_table = 'teams'
多対多の関係を作るにはmodels.ManyToManyField
を指定します。
ManyToManyField
を指定する事でマイグレーション時に自動でTeamとUserの中間テーブルが作成されます。
データの取得
User.teams.all()
Teams.user_set.all()
#チームにユーザーを追加
user = User(name='大谷')
user.save()
team = Team(name='TeamA')
team.save()
user.teams.add(team)
チームにユーザーを追加する場合はチームを作成(save())した後add
で追加する