我在文档中找不到任何东西。对于该字段,我们需要提供两个参数:max_digits和decimal_places。
class Product(models.Model):
price = models.DecimalField(max_digits=10, decimal_places=2)
以上配置最多可存储99999999.99。但是,我想知道此字段是否有最大或最小限制,类似于其他字段存在这些约束的方式。例如,IntegerField只能存储从-2147483648到2147483647。
答案 0 :(得分:2)
IntegerField
对于IntegerField
,Django明确将范围提到为:
class IntegerField(**options)
一个整数。 从
-2147483648
到2147483647
的值在 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]更好表示的数字进行算术运算,否则不会有问题。