如何在Django模型中限制数字字段的最大值?

15 浏览
0 Comments

如何在Django模型中限制数字字段的最大值?

Django有多种可用于模型的数字字段,例如DecimalField和PositiveIntegerField。尽管前者可以限制存储的小数位数和总字符数,但是否有办法将其限制为仅存储在某个范围内的数字,例如0.0-5.0?

如果没有这样的方法,是否有办法限制PositiveIntegerField仅存储最多50的数字,例如?

更新:现在Bug 6845已关闭,这个StackOverflow问题可能已经失效。 -sampablokuper

admin 更改状态以发布 2023年5月20日
0
0 Comments

您也可以创建自定义模型字段类型-请参见http://docs.djangoproject.com/en/dev/howto/custom-model-fields/#howto-custom-model-fields

在这种情况下,您可以'继承'内置的IntegerField并覆盖其验证逻辑。

越想越觉得这对许多Django应用程序非常有用。也许IntegerRangeField类型可以作为补丁提交给Django开发人员,以考虑添加到主干中。

这对我很有用:

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)

或者负数和正数的范围(例如振荡器范围):

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

真正酷的是如果可以像这样使用范围运算符:

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

但是,那将需要更多的代码,因为您可以指定'skip'参数-范围(1,50,2)-虽然是有趣的想法......

0
0 Comments

你可以使用Django内置的验证器 - 内置验证器 -

from django.db.models import IntegerField, Model
from django.core.validators import MaxValueValidator, MinValueValidator
class CoolModelBro(Model):
    limited_integer_field = IntegerField(
        default=1,
        validators=[
            MaxValueValidator(100),
            MinValueValidator(1)
        ]
     )

编辑: 当直接使用模型时,请确保在保存模型之前调用模型的full_clean方法,以触发验证器。当使用ModelForm时,不需要这样做,因为表单会自动执行。

0