【问题标题】:Variable return types of DecimalFieldDecimalField 的可变返回类型
【发布时间】:2020-03-02 03:52:34
【问题描述】:

我有一个类似这样的模型:

class Item(models.Model):
    value_a = models.DecimalField(default=0.0, decimal_places=4, max_digits=20)
    value_b = models.DecimalField(default=0.0, decimal_places=4, max_digits=20)
    value_c = models.DecimalField(default=0.0, decimal_places=4, max_digits=20)

现在假设我有以下物品:

a = Item()
a.value_a = 1.20
a.value_b = 2
a.value_c = Decimal('20.20')
a.save()

当我访问对象时(从数据库检索后)我得到的值:

a.value_a = 1.2 <float>
a.value_b = 2 <int>
a.value_c = Decimal('20.20')

请注意,我的数据库数据类型可能会有所不同。

为什么 DecimalField 会这样做?我不能总是以 python Decimal 的形式获取值吗?

【问题讨论】:

  • Decimal('20.20') 是 python 十进制。您期望什么价值?
  • 好吧,只有 'c' 返回十进制。

标签: django python-3.x django-models floating-point decimal


【解决方案1】:

如果您在更改value 的值后save() 每个创建的Items,Django 会将它们转换为Python 小数。

a = Item()
a.value = 1.20
a.save()
item_a = Item.objects.get(id=a.id)
print(item_a.value)  # will be Decimal('1.20')

【讨论】:

  • 这并不适用于所有情况。我的生产环境中有一个 Oracle 数据库,而为了测试我有一个 postgres 数据库,通过从两个数据库中恢复对象,值并不总是相同的类型,主要是由于每个数据库上定义的数据类型。看,如果在 DB 中列被定义为整数数据类型,python 对象字段将不是 Decimal 而是 int。
  • 是的,如果该字段定义为 DecimalField,它将返回一个 Decimal,如果定义为 IntegerField,它将返回一个 int。你是说如果使用 Oracle DB,Django 会为 DecimalFields 返回一个整数?
  • 这取决于 Oracle DB 上定义的数据类型。如果数据库上的数据类型是整数,当我访问 DecimalField 值时,它是一个 .
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-12-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-02
  • 2023-01-29
相关资源
最近更新 更多