在Django模型

时间:2016-04-28 10:24:16

标签: python django django-models django-admin

我有一个Django视图,它获取一个值并将其存储在数据库中。 值为176033030 miliarsecs,我必须先将其解析为度,然后才能将其插入数据库。

这是我的models.py:

class Position(models.Model):
    latitude = models.DecimalField(max_digits=50, decimal_places=5, default="")
    longitude = models.DecimalField(max_digits=50, decimal_places=5, default="")

    def __str__(self):
        return self.latitude

这是我的views.py:

def insert_data(request, latitude, longitude):
    latitude = latitude/3600000
    longitude = longitude/3600000

    position_data = Position(latitude=latitude, longitude=longitude)
    position_data.save()

    return HttpResponse()

数据在数据库中成功,但不包含小数。 存储的值为48和2,它们应为:

latitude = 176033030/3600000 = 48.89806388888889
longitude = 7985131/3600000 = 2.2180919444444442

如果有人能帮助我,我将不胜感激。

2 个答案:

答案 0 :(得分:3)

您使用的是python 2吗?在这种情况下,你需要做

latitude = latitude / 3600000.0
longitude = longitude / 3600000.0

在python 2中,如果你除了两个整数,你得到一个整数作为结果。最后添加.0会使分母浮动。

你也可以float(3600000)

另一种选择是使用以下方法从python 3“导入”行为:

from __future__ import division

答案 1 :(得分:1)

为了更清楚一点为什么第一个答案是可行的 - 这里的问题是你要创建一个整数,然后尝试将它强制转换为DB中的decimal.Decimal当你添加它。关于你在纬度上的输入数字类型有点不清楚,但是在给出的例子中,你将整数除以整数,这给出了一个整数...

如果你这样做:

type(latitude/360000),它会输出<type 'int'>

但是,在上面给出的另一个答案中,它将创建一个浮点类型

type(latitude/360000.00)将输出<type 'float'>

浮点数和小数之间的转换应该是显式的,而不是隐式地完成 - they are not the same thing.考虑​​到你在这个例子中似乎正在努力的准确性,隐式舍入可能很重要。

更好的路线可能是as per this answer使用:

from decimal import Decimal
Decimal.from_float(latitude/3600000.00)