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

dar*_*rse 2 django decimal django-models

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

class Product(models.Model):
    price = models.DecimalField(max_digits=10, decimal_places=2)
Run Code Online (Sandbox Code Playgroud)

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

Wil*_*sem 5

IntegerField

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

class IntegerField(**options)

一个整数。来自-2147483648to 的值2147483647在 Django 支持的所有数据库中都是安全的。

即便如此,这本身并不是限制,但从那时起,它取决于数据库来支持它。例如,对于MySQL,它将采用INT,这导致 -2'147'483'648 到 2'147'483'647 的范围。

DecimalField

如果我们查看源代码,我们会看到完成了两项检查:

digits_errors = [
    *self._check_decimal_places(),
    *self._check_max_digits(), ]
Run Code Online (Sandbox Code Playgroud)

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

但是,这并不意味着该数据库将本身接受。例如,在 a 的MySQL 规范中DECIMAL,我们看到:

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

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

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

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

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

话虽如此,对于大多数应用程序来说,65 位数字可能就足够了。最大值大于*Avogadro 常数 [wiki]的平方,因此除非您想对用Knuth 的向上箭头符号[wiki]更好表达的数字进行算术运算,否则没有问题。