首页 > 解决方案 > FloatField 在 Django 中返回 str 对象而不是 Float

问题描述

在 Django 中工作时,我偶然发现了这个奇怪的错误(因为它以前从未发生过)。如果在其中FloatField我将浮点值保存为字符串,即“245.4”而不是实际的浮点值,即 245.4,那么在访问该值时,它会返回字符串而不是浮点数!abs(modelname.floatfield) 今天抛出的原因TypeError

在研究中发现了 Django 论坛中的这个旧线程(https://code.djangoproject.com/ticket/19565)。它是否已经决定并实施,或者我应该从现在开始手动输入值还是有人有更好的解决方案?

标签: pythondjango

解决方案


这是预期的行为,并且是设计决策,如票据 #12401中所述:

设置属性时,模型属性不会转换为正确的 Python 类型。这是我们做出的设计决定,如果没有很多向后不兼容,就不会改变。

因此,这是(几乎)所有Fields 的预期行为,尽管严格来说可以使用__get__and__set__方法来改变这种行为(或使用其他技术,如元类),所以严格来说,可以添加这种行为。

毕竟,你只是设置了一个 Python 对象的属性,而那个对象恰好是一个 Python 对象。只有在写入数据库等时,这些属性才会转换为它们对应的数据库类型,反之亦然。在某些情况下,这意味着如果您将一种类型的值存储在对象中,如果将其存储在数据库中,然后检索相同的对象,则该属性具有另一种类型。

然而,不执行这样的转换是有意义的,因为就像评论票 #12401提到的那样:

一般来说,我希望以下内容能够通过,无论是什么foo

>>> x = '2011-06-06'
>>> foo.bar = x
>>> assert foo.bar == x

提议的行为虽然对 Django 模型对象可能有用甚至更好,但肯定会违反这种期望,因此我们做出的设计决定当然是明智的。


推荐阅读