python - FloatField 在 Django 中返回 str 对象而不是 Float
问题描述
在 Django 中工作时,我偶然发现了这个奇怪的错误(因为它以前从未发生过)。如果在其中FloatField
我将浮点值保存为字符串,即“245.4”而不是实际的浮点值,即 245.4,那么在访问该值时,它会返回字符串而不是浮点数!abs(modelname.floatfield) 今天抛出的原因TypeError
。
在研究中发现了 Django 论坛中的这个旧线程(https://code.djangoproject.com/ticket/19565)。它是否已经决定并实施,或者我应该从现在开始手动输入值还是有人有更好的解决方案?
解决方案
这是预期的行为,并且是设计决策,如票据 #12401中所述:
设置属性时,模型属性不会转换为正确的 Python 类型。这是我们做出的设计决定,如果没有很多向后不兼容,就不会改变。
因此,这是(几乎)所有Field
s 的预期行为,尽管严格来说可以使用__get__
and__set__
方法来改变这种行为(或使用其他技术,如元类),所以严格来说,可以添加这种行为。
毕竟,你只是设置了一个 Python 对象的属性,而那个对象恰好是一个 Python 对象。只有在写入数据库等时,这些属性才会转换为它们对应的数据库类型,反之亦然。在某些情况下,这意味着如果您将一种类型的值存储在对象中,如果将其存储在数据库中,然后检索相同的对象,则该属性具有另一种类型。
然而,不执行这样的转换是有意义的,因为就像评论票 #12401提到的那样:
一般来说,我希望以下内容能够通过,无论是什么
foo
:>>> x = '2011-06-06' >>> foo.bar = x >>> assert foo.bar == x
提议的行为虽然对 Django 模型对象可能有用甚至更好,但肯定会违反这种期望,因此我们做出的设计决定当然是明智的。
推荐阅读
- python - 如何使用 PowerShell 使 python argcomplete 运行
- python-3.x - 在 Pyspark 中的 .withColumn 中编写自定义条件
- r - R shiny 中的级别替换创建两个级别列表,一个为 NULL
- typescript - 项目根目录中未引用的 .ts 文件“不在根目录下”
- mysql - 根据其他列中的数据更新列数据
- docker - Docker停止NPM脚本中的所有容器命令?
- django - Django 错误:NoReverseMatch at / Reverse for 'like-post' 未找到
- reactjs - 抓取网格节点周围的元素时的ReactJS消失
- c++ - 如何检查函数指针是否返回bool
- multithreading - Julia 1.5.2 并行启动随机数选择