1. ホーム
  2. python

[解決済み】Djangoモデルで数値フィールドの最大値を制限する方法は?

2022-04-15 06:19:38

質問

Django には、モデルで使用できる様々な数値フィールドがあります、例えば 10進フィールド PositiveIntegerField . 前者は格納する小数点以下の桁数や全体の文字数を制限することができますが、後者は格納する文字数を制限する方法はありますか? のみ 0.0-5.0など、特定の範囲にある数値のことですか?

PositiveIntegerField に、例えば 50 までの数字だけを格納するように制限する方法はありますか?

更新:現在、Bug 6845 は終了しました。 このStackOverflowの質問は無意味かもしれません。- サンパブロクパー

解決方法は?

また、カスタムモデルのフィールドタイプを作成することもできます。 http://docs.djangoproject.com/en/dev/howto/custom-model-fields/#howto-custom-model-fields

この場合、組み込みの IntegerField を '継承' して、その検証ロジックをオーバーライドすることができます。

このことを考えれば考えるほど、これは多くの Django アプリにとってどれほど有用であるかということに気がつきます。おそらく IntegerRangeField 型をパッチとして提出し、Django の開発者が trunk に追加することを検討することができます。

これは私のために動作しています。

from django.db import models

class IntegerRangeField(models.IntegerField):
    def __init__(self, verbose_name=None, name=None, min_value=None, max_value=None, **kwargs):
        self.min_value, self.max_value = min_value, max_value
        models.IntegerField.__init__(self, verbose_name, name, **kwargs)
    def formfield(self, **kwargs):
        defaults = {'min_value': self.min_value, 'max_value':self.max_value}
        defaults.update(kwargs)
        return super(IntegerRangeField, self).formfield(**defaults)

そして、モデルクラスでは、次のように使用します (field は、上記のコードを置いたモジュールです)。

size = fields.IntegerRangeField(min_value=1, max_value=50)

ORで負と正の範囲(オシレータの範囲のようなもの)を表す。

size = fields.IntegerRangeField(min_value=-100, max_value=100)

本当にクールなのは、このように範囲演算子で呼び出すことができることでしょう。

size = fields.IntegerRangeField(range(1, 50))

しかし、「スキップ」パラメータを指定することができるので、その場合、多くのコードが必要になります - range(1, 50, 2) - 面白いアイデアですが......。