Django有各种数字字段可用于模型,例如DecimalFieldPositiveIntegerField.虽然前者可以限制为存储的小数位数和存储的字符总数,但有没有办法将其限制为在一定范围内存储only个数字,例如0.0-5.0?

如果做不到这一点,有没有办法限制一个PositiveIntegerField只存储最多50个数字?

Update: now that Bug 6845 100, this StackOverflow question may be moot. - sampablokuper

推荐答案

还可以创建自定义模型字段类型-请参见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 ...

Python相关问答推荐

手动为pandas中的列上色

如何在Pygame中绘制右对齐的文本?

PyTorch卷积自动编码器,输出维度与输入不同

过滤绕轴旋转的螺旋桨

阅读Polars Python中管道的函数定义

如何根据另一列值用字典中的值替换列值

@Property方法上的inspect.getmembers出现意外行为,引发异常

如何比较numPy数组中的两个图像以获取它们不同的像素

对某些列的总数进行民意调查,但不单独列出每列

在Polars(Python库)中将二进制转换为具有非UTF-8字符的字符串变量

如何在solve()之后获得症状上的等式的值

如何根据一列的值有条件地 Select 前N个组,然后按两列分组?

用砂箱开发Web统计分析

在Python中计算连续天数

在极中解析带有数字和SI前缀的字符串

ConversationalRetrivalChain引发键错误

通过追加列表以极向聚合

Flask运行时无法在Python中打印到控制台

如何使用正则表达式修改toml文件中指定字段中的参数值

我对这个简单的异步者的例子有什么错误的理解吗?