LoginSignup
0
1

More than 1 year has passed since last update.

Djangoのモデル作成・一対多・多対多

Posted at

モデルの作成

モデルの作成はアプリフォルダーのmodels.pyに記述します。
ここではUserモデルを作成し、名前とメールアドレスのフィールドを持たせたいと思います。

User/models.py
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モデルと一対多の関係を作ります。
「一つのチームに複数のユーザーが所属している」という関係になります。

User/models.py
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を多対多の関係にしてみましょう
「複数のチームがあり、ユーザーは複数のチームに所属することができる」という関係になります。

User/models.py
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で追加する

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1