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



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

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

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

IntegerField

对于IntegerField,Django明确提到这个范围是:

class IntegerField(**options)

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

即便如此,这本身也不是限制,但从那时起,由数据库来支持它。例如,对于MySQL,它将需要一个INT,这会导致-2'147'483'648到2'147'483'647的范围。

DecimalField

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

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

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

但这并不意味着数据库本身会接受它。例如,在 MySQL 规范中 对于一个DECIMAL,我们看到:

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

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

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

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

因此,最好查阅数据库后端的文档。如果尝试定义表,则会在迁移中获得错误,因此只需"尝试"使用如此大的值,并查看数据库是否可以处理它们。

话虽如此,65 位数字对于大多数应用程序来说可能就足够了。最大值大于阿伏伽德罗常数[wiki]的平方,所以除非你想对用高德纳的向上箭头符号[wiki]更好地表达的数字进行算术,否则没有问题。

最新更新