Django有各种可用于模型的数字字段,例如DecimalField和PositiveIntegerField。尽管前者可以限制为存储的小数位数和总字符数,但是有没有办法将其限制为仅存储一定范围内的数字,例如0.0-5.0?
失败了,有什么方法可以限制PositiveIntegerField只存储例如最大为50的数字吗?
在这种情况下,你可以从内置的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)
然后,在模型类中,你将像这样使用它(字段是放置上面代码的模块):
size = fields.IntegerRangeField(min_value=1, max_value=50)
对于一个负值和正值范围(例如振荡器范围)进行“或”操作:
size = fields.IntegerRangeField(min_value=-100, max_value=100)
真正很酷的是,如果可以使用范围运算符像这样调用它:
size = fields.IntegerRangeField(range(1, 50))
但是,这将需要更多代码,因为你可以指定“跳过”参数-range(1,50,2)-有趣的主意…
你可以使用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表格时不需要这样做,因为表格会自动执行。
ModelForm