FloatField返回str对象而不是Django中的Float

时间:2018-12-30 10:39:52

标签: python django

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

在研究中,在Django论坛(https://code.djangoproject.com/ticket/19565)中发现了这个古老的话题。它是否已决定并实施,还是我应该从现在开始手动键入值,还是有人可以找到更好的解决方案?

1 个答案:

答案 0 :(得分:2)

这是预期的行为,是一种设计决策,如ticket #12401所述:

  设置属性时,

模型属性未转换为正确的Python类型。那是我们所做的设计决定,而且要避免很多向后不兼容的情况,这是不会改变的。

因此,这是(几乎)所有Field的预期行为,尽管严格来讲,一个人可以使用__get__ and __set__方法来更改该行为(或使用其他技术,例如元类),因此严格来说 可能会添加此类行为。

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

但是,不执行此类转换是有意义的,因为就像评论ticket #12401所提到的那样:

  

通常,无论foo是什么,我都希望通过以下内容   是:

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

建议的行为,尽管对以下方面可能有用,甚至更好   Django模型对象肯定会违反该期望,因此   我们做出的设计决定当然是明智的。