模型表单中定义的
Decimal
字段表现为Django之外的integer
;该字段仍然是Django应用程序中的Decimal
。为什么会发生这种情况?如何强制字段在所有用例中保持Decimal
?
背景
使用model form
,我已将数据库中两个字段(low
和medium
)的数据类型设置为小数,如下所示:
class Limit(models.Model):
test = models.ForeignKey(Test)
low = models.DecimalField('Low', max_digits=19, decimal_places=10, blank = True, default =None, null = True)
med = models.DecimalField('Medium', max_digits=19, decimal_places=10, blank = True, default =None, null = True)
输入表单的字段值为:
low med
135 2.3
7.7 13.2
1.98 3.4
0.84 2.9
0.132 2.2
0.9 2.8
1 4.1
5 3.4
0.47 5.3
27 4.3
在Django应用程序中使用时,字段low
和med
表现为小数。
在manage.py shell中:
lims = Limit.objects.filter(low__isnull=False)
for item in lims:
print type(item.low)
<class 'decimal.Decimal'>
...
<class 'decimal.Decimal'>
在应用程序本身中,值也显示小数位并表现为小数。
问题:
在应用程序之外,low
值是整数,而med
值仍为小数:
这些值来自DbVisualizer,但同样是通过dbConnect(SQLite()...
在R中提取的。
135 2.3
0 3.4
0 2.8
5 3.4
1 4.1
0 5.3
0 2.9
0 2.2
0 13.2
27 4.3
使用DBVisualizer似乎low
字段类型是一个事实整数和一个JDBC:BIGINT;字段med
是一个浮点数和一个JDBC:DOUBLE。
尝试解决问题:
到目前为止,我重新启动了几次,重新连接并断开连接到数据库,尝试对问题表进行小的更改并迁移它,并将所有十进制值作为数据输入。
其他信息:
该应用程序是使用Django 1.7.1构建的,目前处于mac pro(OS X 10.9.5)的开发环境中。
没有关于数据库的定制,这里是settings.py行:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db2.sqlite3'),
}
}
非常感谢任何帮助。
答案 0 :(得分:0)
尽管重建数据库,整数自动转换异常仍然存在。作为临时解决方案,我将字段更改为float
,它确实保留小数位。
class Limit(models.Model):
test = models.ForeignKey(Test)
low = models.FloatField('Low', blank = True, default =None, null = True)
med = models.DecimalField('Medium', max_digits=19, decimal_places=10, blank = True, default =None, null = True)
在DBVisualizer中查询:
135.0 2.3
1.98 3.4
0.9 2.8
5.0 3.4
1.0 4.1
0.47 5.3
0.84 2.9
0.132 2.2
7.7 13.2
27.0 4.3
现在我只需要小心使用那个浮点数进行任何相等比较......
我仍然欢迎任何解决此明显错误的永久解决方案。