はじめに
DjangoのAbstract Modelを使って2個のモデルに継承を行い、個別にテーブルを作りたかったのでメモしておきます。
Abstract Modelから継承したモデルをOneToOneFieldでリレーションする場合、同じアプリと別のアプリから指定する記述方法が異なりました。
環境
- Django 5.0.3 - Python 3.10.13 - pipenv 2023.12.1
構成
- app
- app_child
- config
- settings.py
- db.sqlite3
- manage.py
settings.py
appとapp_childを追加します。
INSTALLED_APPS = [
--- 省略 ---
'app',
'app_child',
]
app/models.py
appのモデルを記述します。
from django.db import models
from django.contrib.auth import get_user_model
UserModel = get_user_model()
# abstractモデル
class ArticleBase(models.Model):
class Meta:
abstract = True
user = models.ForeignKey(UserModel, on_delete=models.CASCADE)
is_save = models.BooleanField(default=False)
# 継承
class Article(ArticleBase):
title = models.CharField(max_length=256)
# 同じアプリ内のOneToOneField
class TestLocal(models.Model):
name1 = models.OneToOneField('app.Article', on_delete=models.CASCADE, related_name='article11')
name2 = models.OneToOneField('app.Article', on_delete=models.CASCADE, related_name='article12')
app_child/models.py
app_childのモデルを記述します。
別アプリから指定する場合は【アプリ名】.【モデル名】です。
今回は「app.Article」のように記述します。
「Article」と指定するとエラーになります。
from django.db import models
#from app.models import Article
# 別アプリのOneToOneField
class TestRemote(models.Model):
name1 = models.OneToOneField('app.Article', on_delete=models.CASCADE, related_name='article21')
name2 = models.OneToOneField('app.Article', on_delete=models.CASCADE, related_name='article22')
テスト
マイグレーションできるかテストします。
python manage.py makemigrations
結果です。
Migrations for 'app':
app/migrations/0001_initial.py
- Create model Article
- Create model TestLocal
Migrations for 'app_child':
app_child/migrations/0001_initial.py
- Create model TestRemote


Comments