为什么Django sqlite数据库中的字段在应用程序之外从十进制转换为整数?

时间:2014-12-16 20:46:07

标签: python django sqlite

  

模型表单中定义的Decimal字段表现为Django之外的integer;该字段仍然是Django应用程序中的Decimal。为什么会发生这种情况?如何强制字段在所有用例中保持Decimal

背景

使用model form,我已将数据库中两个字段(lowmedium)的数据类型设置为小数,如下所示:

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应用程序中使用时,字段lowmed表现为小数。

在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'),
   }
}

非常感谢任何帮助。

1 个答案:

答案 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

现在我只需要小心使用那个浮点数进行任何相等比较......

我仍然欢迎任何解决此明显错误的永久解决方案。