还可以创建自定义模型字段类型-请参见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)
真正酷的是,如果可以用range操作符这样调用它:
size = fields.IntegerRangeField(range(1, 50))
但是,这需要更多的代码,因为你可以指定一个"跳过"参数——范围(1,50,2)——尽管这是一个有趣的 idea ...