Python | Django | モデルを用いたテーブル間の紐づけにおけるone-to-oneの使い方

2021年7月2日

公開日: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/

以上