【Django】model で抽象メソッドを定義する

django

Django で抽象メソッドを定義した抽象 model を作成する方法について説明します。

meta – abstract

Django の model では以下のように abstract を設定することができます。

# models.py
from django.db import models

class BaseModel(models.Model)
    class Meta:
        abstract = True

abstract を設定した model は migrate にてテーブルが作成されなくなるなどの特徴があります。

抽象メソッド

一方で基本クラスに抽象メソッドを定義したい場合はがありますが、これは meta の設定ではできません。

Python では抽象化に abc を使いますが、これと meta のabstract は相性が良くないようでそのままでは実装することができません。

以下のように少し遠回りする形で実装します。

# models.py
from abs import ABCMeta, abstractmethod
from django.db import models

class AbstractModelMeta(ABCMeta, type(models.Model)):
    pass

class BaseModel(models.Model, metaclass=AbstractModelMeta):
    class Meta:
        abstract = True

    @classmethod
    @abstractmethod
    class from_domain(cls, obj: Entity):
        """抽象メソッド""""
        ...
参考
Attention Required! | Cloudflare
タイトルとURLをコピーしました