我有一个 django 字段 total_price
在 postgres
数据库版本 9.3.11
。
这是代码:
total_value = models.DecimalField(decimal_places=100, default=0, max_digits=300)
我想将它转换为正确的小数点后两位。所以我写了这个:
total_value = models.DecimalField(decimal_places=2, default=0, max_digits=10)
我的迁移文件
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
from django.db import models, migrations
class Migration(migrations.Migration):
dependencies = [
('my_table', '0040_my_table_skipped'),
]
operations = [
migrations.AlterField(
model_name='my_table',
name='total_value',
field=models.DecimalField(default=0,
max_digits=10,
decimal_places=2),
),
]
当我运行命令时 python manage.py migrate
我从 postgresql 得到一个错误:
A field with precision 10, scale 2 must round to an absolute value less than 10^8.
原文由 Mahammad Adil Azeem 发布,翻译遵循 CC BY-SA 4.0 许可协议
正如@sivakumar-r 上面提到的,这是精度和规模问题。
让我们看看
Numeric(precision, scale)
是如何工作的:假设,如果我们有一个用
NUMERIC(10,3)
定义的列。这意味着,我们总共只能保存 10 位数字,小数点后保留 3 个空格。
所以在这种情况下你可以保存的范围是:+9999999.999 到 -9999999.999。
一种解决方案可能是:
更改表列以使用类型
NUMERIC
没有精度和小数位数。这将接受小数点前最多 131072 位数字;小数点后最多 16383 位。 如 postgres:11 数值类型文档中所述。