解决报错Django exception: decimal.InvalidOperation: [<class ‘decimal.InvalidOperation‘>]

文章讲述了作者在使用PostgreSQL和postgis存储高精度点数据时遇到DecimalField精度问题,通过将DecimalField改为FloatField解决了问题。讨论了可能的替代方法和对精度需求的考虑。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先说明一下出现问题的场景:

我用的是PostgreSQL+postgis,里面存储的是很多的点数据。

然后是直接使用的逆向生成模型类,所以它自动导出的格式为:

models.py:

latitude = models.DecimalField(max_digits=65535, decimal_places=65535, blank=True, null=True)
longitude = models.DecimalField(max_digits=65535, decimal_places=65535, blank=True, null=True)

返回数据的方法为:

class AttractionView(APIView):
    def get(self, request):
        data = models.Jingdian.objects.all()
        serializer = Serializers(instance=data, many=True)
        return Response({"code": 200,"data":{"record":serializer.data}})

就是一个很简单的返回数据的方法。

然后就报错:Django exception: decimal.InvalidOperation: [<class 'decimal.InvalidOperation'>]

我的解决方法是直接将models.py里面的DecimalField更改为FloatField

models.py:

latitude = models.FloatField(blank=True, null=True)
longitude = models.FloatField(blank=True, null=True)

因为我这里就是一个简单的经纬度,所以我直接更改也没有什么太大的影响,只要能出正确的经纬度就行。如果的确是需要确保使用decimal,可能就还得想其它的方法了。

如果我这种方法有什么问题或者有更好的解决办法欢迎在评论区留言!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值