1. ホーム
  2. python

[解決済み] Django IntegerField を choices=... 名で設定する。

2022-07-29 10:36:19

質問

選択肢を持つモデルフィールドがあるとき、人間が読める名前に関連付けられたいくつかの魔法の値を持っている傾向があります。Django に、これらのフィールドを値の代わりに人間が読める名前で設定する便利な方法はありますか?

このモデルを考えてみましょう。

class Thing(models.Model):
  PRIORITIES = (
    (0, 'Low'),
    (1, 'Normal'),
    (2, 'High'),
  )

  priority = models.IntegerField(default=0, choices=PRIORITIES)

ある時点でThingのインスタンスを持っていて、その優先順位を設定したいと思います。明らかにできることです。

thing.priority = 1

しかし、これではPRIORITIESの値-名前の対応を覚えなければなりません。これではうまくいきません。

thing.priority = 'Normal' # Throws ValueError on .save()

現在、私はこのような愚かな回避策をとっています。

thing.priority = dict((key,value) for (value,key) in Thing.PRIORITIES)['Normal']

といった具合ですが、これでは不格好です。このシナリオがいかに一般的であるかを考えると、私は誰かがより良い解決策を持っているかどうか疑問に思っていました。私が完全に見落としている、選択名によってフィールドを設定するためのフィールドメソッドがあるのでしょうか?

どのように解決するのですか?

次のようにします。 こちらをご覧ください . そうすれば、適切な整数を表す単語を使用することができます。

のようにします。

LOW = 0
NORMAL = 1
HIGH = 2
STATUS_CHOICES = (
    (LOW, 'Low'),
    (NORMAL, 'Normal'),
    (HIGH, 'High'),
)

では、DB上では整数のままです。

使用法は次のようになります。 thing.priority = Thing.NORMAL