Python | Django | モデルを用いたテーブル間の紐づけにおけるone-to-oneの使い方
公開日:2021/7/2
Pythonには,DjangoというWebアプリケーションフレームワークがある.フレームワークのため,Djangoを利用するとWebアプリを通常よりも短時間で開発することが可能になる.
前記事にて,「モデルを用いたテーブル間の紐づけにおけるon_delete optionの使い方」を記した.前記事での設定をそのまま引き継いだ上で,本記事では,「モデルを用いたテーブル間の紐づけにおけるone-to-oneの使い方」を以下に記す.
◆実施環境
Python 3.8.8
Django 3.2.3
■モデルを用いたテーブル間の紐づけにおけるone-to-oneの使い方
“model_app/models.py"に新たなclass(“Places", “Companies")を追加する."models.py"の内容は以下になる.
from django.db import models
from django.utils import timezone
class
Date(models.Model):
# 抽象基底クラス
create_date = models.DateTimeField(default=timezone.now)
update_date = models.DateTimeField(default=timezone.now)
class
Meta:
abstract =
True
class
Cake(Date):
cake_name = models.CharField(max_length=40)
birthplace = models.CharField(max_length=40)
birthday = models.DateField(default='1900-01-01')
inventor = models.CharField(max_length=40)
sales_amounts = models.IntegerField()
like = models.BooleanField(default=True)
email = models.EmailField(db_index=True)
web_site = models.URLField()
feed_back = models.TextField(null=True,blank=True)
class
Meta:
db_table =
'cake'
index_together =
[['cake_name','inventor']]
ordering =
['birthday']
def
__str__(self):
return
f'{self.cake_name}'
class Dorayakis(models.Model):
name = models.CharField(max_length=30)
price = models.IntegerField()
birthday = models.DateField(default='1900-01-01')
shop = models.ForeignKey(
'Shops', on_delete=models.RESTRICT
)
city = models.ForeignKey(
'Cities', on_delete=models.CASCADE
)
class
Meta:
db_table =
'dorayakis'
class Shops(models.Model):
name = models.CharField(max_length=30)
city = models.ForeignKey(
'Cities', on_delete=models.CASCADE
)
class
Meta:
db_table =
'shops'
class
Cities(models.Model):
name = models.CharField(max_length=30)
class
Meta:
db_table =
'cities'
class Places(models.Model): # 以下追記箇所
name = models.CharField(max_length=50)
address = models.CharField(max_length=80)
class Meta:
db_table = 'places'
class Companies(models.Model):
place = models.OneToOneField( # OneToOneFieldの利用
Places,
on_delete=models.CASCADE,
primary_key=True
)
name = models.CharField(max_length=50)
class Meta:
db_table = 'companies'
“model_project"に"onetoone_val.py"を作成する.プロジェクトの構成は以下になる.
“model_project/onetoone_val.py"を以下のように編集する.
import os
os.environ.setdefault('DJANGO_SETTINGS_MODULE','model_project.settings')
from django import setup
setup()
from model_app.models import Places, Companies
places = [
('Kawasaki','Kanagawa'),('Kobe','Hyogo')
]
companies = ['JFE Steel','KOBE Steel']
p1 = Places(name='Kawasaki', address='Kanagawa')
p1.save()
p2 = Places(name='Kobe', address='Hyogo')
p2.save()
c1 = Companies(place=p1, name='JFE Steel')
c1.save()
c2 = Companies(place=p2, name='KOBE Steel')
c2.save()
ターミナルを開き,”conda activate 仮想環境名”を実行し,仮想環境に移行する.”model_project”のディレクトリで”python manage.py makemigrations model_app –name add_place_company”を実行すると,以下が出力される.
Migrations for 'model_app':
model_app\migrations\0003_add_place_company.py
- Create model Places
- Create model Companies
”model_app/migrations”には以下のように"0003_add_place_company.py"が作成される.
続けて,”model_project”のディレクトリで”python manage.py migrate model_app”を実行すると,以下が出力される.
Operations to perform:
Apply all migrations: model_app
Running migrations:
Applying model_app.0003_add_place_company... OK
SQLiteをインストールし(詳細はこちら参照),"SQLITE EXPLORER"を開くと,各class(“places", “companies")を以下赤枠にて確認できる.
“onetoone_val.py"で右クリックをすると,以下コマンドが現れるので,"Run Python File in Terminal"をクリックする.DBに上記値が追加される.
“SQLITE EXPLORER"を開き,"places"と"companies"を右クリックし,"Show Table"をクリックする."places"テーブルでは,以下値が入力される.
“companies"テーブルでは,以下値が入力される.
■参照
https://docs.djangoproject.com/en/3.2/topics/db/examples/one_to_one/
以上