Django3.0のIntegerChoicesをDjango2.xで使う
Django 3.0 から、django.db.models に Choices, TextChoices, IntegerChoices が追加された。
利用例
code:python
from django.db import models
class Task(models.Model):
State = models.IntegerChoices('State', '未処理 処理中 完了 保留')
state = models.IntegerField('状態', choices=State.choices)
"""
>> Task.State.choices
((1, '未処理'), (2, '処理中'), (3, '完了'), (4, '保留'))
"""
便利なので積極的に使って行きたい。
今後書くコードでは使って行きたいけど、Django 2.x を使ってる既存環境ではどうしよう?
Django-2.2.8 では .choices は期待通りに動作しました。
バックポートせずに、必要最小限の実装がほしければ、 enum.EnumMeta を継承して以下のようなコードを書けば良さそう。
code:python
from django.db import models
import enum
class StateMeta(enum.EnumMeta):
@property
def choices(cls):
class State(enum.IntEnum, metaclass=StateMeta):
未処理 = 1
処理中 = 2
完了 = 3
保留 = 4
"""
>> State.choices
((1, '未処理'), (2, '処理中'), (3, '完了'), (4, '保留'))
"""