Python Django IntegerRangeField验证失败
我正在尝试为年龄范围字段实现。不幸的是,文档没有说明如何验证上界和下界 我从模型上试过,如下所示:Python Django IntegerRangeField验证失败,python,django,postgresql,Python,Django,Postgresql,我正在尝试为年龄范围字段实现。不幸的是,文档没有说明如何验证上界和下界 我从模型上试过,如下所示: class SomeModel(models.Model): age_range = IntegerRangeField(default='(0,100)', blank=True, validators=[MinValueValidator(1), MaxValueValidator(100)]) 问题是,无论您在字段中输入什么,Django都会抛出ValidationError: 该
class SomeModel(models.Model):
age_range = IntegerRangeField(default='(0,100)', blank=True, validators=[MinValueValidator(1), MaxValueValidator(100)])
问题是,无论您在字段中输入什么,Django都会抛出ValidationError:
该值必须小于或等于100
另外,如果我没有在字段中输入任何内容,它就不会输入默认范围,并且会失败,并抱怨IntegrityError
因此,我尝试从form对象执行此操作:
class SomeForm(forms.ModelForm):
age_range = IntegerRangeField(validators=[MinValueValidator(1), MaxValueValidator(100)])
但这根本没用。我在字段中输入的任何数字都可以保存。我做错了什么?MinValueValidator和MaxValueValidator用于整数,因此它们在这里使用的验证器不正确。而是专门针对以下范围使用验证器:
RangeMinValueValidator
和RangeMaxValueValidator
这两个验证器都位于模块django.contrib.postgres.validators
中
到验证程序源代码
另外,IntegerRangeField
在Python中表示为psycopg2.extras.numeriRange
对象,因此在模型中指定默认参数时,请尝试使用该对象而不是字符串
注意:默认情况下,numeriRange
对象包含下限,不包含上限,因此numeriRange(0,100)将包括0,而不包括100。您可能需要NumericRange(1101)。您还可以在numeriRange
对象中指定bounds
参数,以更改包含/排除的默认值,而不是更改数值。看
例如:
# models.py file
from django.contrib.postgres.validators import RangeMinValueValidator, RangeMaxValueValidator
from psycopg2.extras import NumericRange
class SomeModel(models.Model):
age_range = IntegerRangeField(
default=NumericRange(1, 101),
blank=True,
validators=[
RangeMinValueValidator(1),
RangeMaxValueValidator(100)
]
)
试试这个,告诉我发生了什么:age\u range=integerrange=field(lower=1,upper=100,bounds=“[])
我从psycopg2文档中得到它,django integerrange文档提到它继承自psycopg2中的numeriRange字段,不要忘记这些是特定于PostgreSQL的字段,确保您使用的是PostgreSQL数据库。@HassenPy这实际上是我在模型中尝试的第一件事。没用。Django甚至不会迁移,说它们是意外的关键字。就我个人而言,我不会使用一个文档记录糟糕的功能,实际上缺乏关于如何实现的资源,尝试创建一个自己的自定义字段,这可能会让你感兴趣,如果你成功了!我看了所有的contrib.postgres文件,但一定是漏掉了这个。谢谢NumericRange注释也很有帮助,尽管我以前的方法似乎也有效。