Python/Django中的十进制数

8

我正在尝试向数据库中插入数据,但似乎存在小数问题。

我有latitudelongitude,例如以下示例:

latitude = models.DecimalField(max_digits=30, decimal_places=15)

然后,当我尝试插入数据时,我会写:

Place(name="center", description="study center", latitude=41.214555, longitude=2.121451)

但是我遇到了这个错误:"quantize result has too many digits for current context"

我应该可以使用这些数字,对吗?我不明白为什么会出现这个错误。如果有人能帮助我,我将非常感激。


看这个:https://dev59.com/W0vSa4cB1Zd3GeqPdEiw - Rohan
你确定数据库已经成功迁移了吗?为了确保一下。 - Sahil kalra
1个回答

9

考虑这个模型:

class Place(models.Model):
    name = models.TextField()
    description = models.TextField()
    longitude = models.DecimalField(max_digits=30, decimal_places=15)
    latitude = models.DecimalField(max_digits=30, decimal_places=15)

这应该可以工作(使用最大允许数字和小数位数):

p = Place(
    name='Name',
    description='Description',
    latitude=0123456789012345.0123456789012345,
    longitude=0123456789012345.0123456789012345
)
p.save()

这应该会失败(值过高):

p = Place(
    name='Name',
    description='Description',
    latitude=01234567890123456.01234567890123456,
    longitude=01234567890123456.01234567890123456
)
p.save()

在更改Django代码后,请确保相应地迁移/更改数据库。


迁移的需求是什么提示你的? - Rohan
以MySQL为例,以下是添加十进制列的方式:CREATE TABLE my_table ( my_column DECIMAL(6, 4) UNSIGNED NOT NULL );Django遵循规范,因此在创建列时,它会使用“max_digits”和“decimal_places”的值来创建适当的列。如果更改了这些值,则应相应地更改数据库。 - Artur Barseghyan
仍然不清楚为什么需要迁移,因为OP没有提到他更改了这些值。 - Rohan
假设您最初将“max_digits”设置为6,将“decimal_places”设置为4,则您的数据库将定义十进制列为DECIMAL(6,4)。在将Django代码更改为15,15(对于“max_digits”和“decimal_places”)后,您的数据库模式仍将该列定义为DECIMAL(6,4)。如果您尝试插入不符合这些定义的数据到数据库中,数据库会向Django“抱怨”,从而导致错误。这就是为什么您需要迁移,以便使模式列与Django代码定义同步。 - Artur Barseghyan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接