Django IntegerRangeField验证失败

14 浏览
0 Comments

Django IntegerRangeField验证失败

我正在尝试为年龄范围字段实现IntegerRangeField()。不幸的是,文档没有说明如何验证上下限。我尝试了从模型中这样使用:

class SomeModel(models.Model):
    age_range = IntegerRangeField(default='(0,100)', blank=True, validators=[MinValueValidator(1), MaxValueValidator(100)])

问题是,无论你在字段中放入什么,Django都会抛出一个ValidationError:

该值必须小于或等于100

而且,如果我在字段中什么都不放,它不会使用默认范围,而是会抛出一个IntegrityError。

所以,我尝试从表单对象中这样做:

class SomeForm(forms.ModelForm):
    age_range = IntegerRangeField(validators=[MinValueValidator(1), MaxValueValidator(100)])

但是这根本没有起作用。我在字段中放入的任何数字都会被保存。我做错了什么?

0
0 Comments

问题原因:在使用Django的IntegerRangeField字段时,使用了错误的验证器(MinValueValidator和MaxValueValidator),应该使用RangeMinValueValidator和RangeMaxValueValidator来验证范围。

解决方法:使用django.contrib.postgres.validators模块中的RangeMinValueValidator和RangeMaxValueValidator来验证范围。此外,当在模型中指定default参数时,应该使用psycopg2.extras.NumericRange对象代替字符串。

注意:NumericRange对象默认情况下包含下限但不包含上限,所以NumericRange(0, 100)将包含0但不包含100。如果想要包含100,可以使用NumericRange(1, 101)。还可以在NumericRange对象中指定bounds参数来更改默认的包含/排除规则。

示例代码如下:

# models.py文件
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)
        ]
    )

这个解决方法有效!我浏览了所有的contrib.postgres文件,但可能错过了这个。感谢你的帮助,NumericRange的注意事项也很有帮助,尽管我的以前的方法似乎也起作用。

0