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

问题:

Django有各种数字字段可用于模型,例如DecimalFieldPositiveIntegerField。虽然前者可以限制存储的小数位数和存储的总字符数,但是有没有办法限制它将only数字存储在一定范围内,例如0.0-5.0?
没有,有什么办法限制一个PositiveIntegerField只存储,例如,数字高达50?
 

回答:

您还可以创建自定义模型字段类型 – 请参阅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)

然后在你的模型类中,你可以这样使用(字段是放在上面的代码的模块):

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))

但是,这将需要更多的代码,因为您可以指定“skip”参数 – 范围(1,50,2) – 有趣的想法,但…

 
 
Code问答: http://codewenda.com/topics/python/
Stackoverflow: How to limit the maximum value of a numeric field in a Django model?

*转载请注明本文链接以及stackoverflow的英文链接

发表评论

电子邮件地址不会被公开。 必填项已用*标注

− 3 = 1