Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django IntegerRangeField验证失败_Python_Django_Postgresql - Fatal编程技术网

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注释也很有帮助,尽管我以前的方法似乎也有效。