使用Django的DecimalField可以存储的最大和最小十进制数是多少?

时间:2018-09-30 18:45:27

标签: django django-models decimal

我在文档中找不到任何东西。对于该字段,我们需要提供两个参数:max_digits和decimal_places。

class Product(models.Model):
    price = models.DecimalField(max_digits=10, decimal_places=2)

以上配置最多可存储99999999.99。但是,我想知道此字段是否有最大或最小限制,类似于其他字段存在这些约束的方式。例如,IntegerField只能存储从-2147483648到2147483647。

1 个答案:

答案 0 :(得分:2)

IntegerField

对于IntegerField,Django明确将范围提到为:

  

class IntegerField(**options)

     

一个整数。 -21474836482147483647 的值在   Django支持的所有数据库。

即使那不是本身的限制,但从那时起,由数据库来支持它。例如,对于MySQL,它将花费INT,其结果范围为-2'147'483'648至2'147'483'647。

DecimalField

如果我们看一下source code,就会发现已经完成了两项检查:

digits_errors = [
    *self._check_decimal_places(),
    *self._check_max_digits(), ]

如果我们深入研究这些检查,我们只会看到max_digits应该大于零(所以> 0),而decimal_places应当大于或等于零(所以>= 0

但是,不是并不意味着数据库本身会接受它。例如,在MySQL specifications for a DECIMAL中,我们看到:

  

DECIMAL列的声明语法为DECIMAL(M,D)。的   参数值的范围如下:

     
      
  • M 是最大位数(精度)。 范围是1到65
  •   
  • D 是小数点(小数点)右边的位数。它的范围是 0到30 ,并且不得大于   M
  •   

因此,即使Django接受某些值,也不意味着每个后端都会接受这些值。这些也可能在数据库后端之间有所不同。例如,在PostgreSQL中,我们有:

  

小数点前最多 131072位;小数点后最多 16383位

因此,最好查阅数据库后端的文档。如果尝试定义该表,则会在迁移中遇到错误,因此您可以简单地“尝试”使用如此大的值,并查看数据库是否可以处理它们。

话虽如此,对于大多数应用而言,65位数字可能就足够了。最大值大于*Avogadro's constant [wiki]的平方,因此,除非要对用Knuth's up-arrow notation [wiki]更好表示的数字进行算术运算,否则不会有问题。