我在文档中找不到任何东西。对于字段,我们需要提供两个参数: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)
整数。从
-2147483648
到2147483647
的值在 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]更好地表达的数字进行算术,否则没有问题。