首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在Django模型中限制数值字段的最大值?

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

Stack Overflow用户
提问于 2009-05-11 17:29:57
回答 7查看 182.7K关注 0票数 202

Django有各种可在模型中使用的数字字段,例如DecimalFieldPositiveIntegerField。虽然前者可以限制为存储的小数位数和存储的总字符数,但有没有办法将其限制为仅存储一定范围内的数字,例如0.0-5.0?

如果做不到这一点,有没有办法限制PositiveIntegerField只存储数字,例如,最多存储50个数字?

更新:现在错误6845 ,这个StackOverflow问题可能是没有意义的。- sampablokuper

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2009-05-11 18:31:21

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

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

我想得越多,我就意识到这对许多Django应用程序是多么有用。也许可以将IntegerRangeField类型作为补丁提交给Django开发人员,以便考虑添加到主干中。

这对我很有效:

代码语言:javascript
复制
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是您放置上述代码的模块):

代码语言:javascript
复制
size = fields.IntegerRangeField(min_value=1, max_value=50)

或者对于负值和正值的范围(如振荡器范围):

代码语言:javascript
复制
size = fields.IntegerRangeField(min_value=-100, max_value=100)

如果可以像下面这样用范围操作符调用它,那将是非常酷的:

代码语言:javascript
复制
size = fields.IntegerRangeField(range(1, 50))

但是,这将需要更多的代码,因为你可以指定一个“跳过”参数- range(1,50,2) -有趣的想法……

票数 145
EN

Stack Overflow用户

发布于 2012-08-19 21:32:39

您可以使用Django's built-in validators-

代码语言:javascript
复制
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时,这不是必需的,因为表单将自动执行此操作。

票数 437
EN

Stack Overflow用户

发布于 2012-08-19 21:54:25

代码语言:javascript
复制
from django.db import models
from django.core.validators import MinValueValidator, MaxValueValidator

size = models.IntegerField(validators=[MinValueValidator(0),
                                       MaxValueValidator(5)])
票数 101
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/849142

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档