在Django中工作时,我偶然发现了这个奇怪的错误(因为以前从未发生过)。如果在FloatField
中我将浮点值保存为字符串,即'245.4',而不是实际的浮点值,即245.4,那么在访问该值时,它将返回字符串而不是浮点!今天abs(modelname.floatfield)抛出TypeError
的原因。
在研究中,在Django论坛(https://code.djangoproject.com/ticket/19565)中发现了这个古老的话题。它是否已决定并实施,还是我应该从现在开始手动键入值,还是有人可以找到更好的解决方案?
答案 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模型对象肯定会违反该期望,因此 我们做出的设计决定当然是明智的。