Django中如何基于数据库模型类而非视图类运行函数?
问题描述
在views.py中使用自定义的Extruders类时功能正常,但切换为models.py中的Extruder数据库模型类后,出现错误:'<'' not supported between instances of 'int' and 'DeferredAttribute'。尝试用int()转换时,又触发类型错误:int() argument must be a string, a bytes-like object or a number, not 'DeferredAttribute'。
问题分析
- 核心错误:遍历数据库查询集
extruders时,错误地访问了模型类Extruder的字段属性(如Extruder.min_width),而非循环中当前模型实例extruder的字段值。 - Django模型的字段在类层面是
DeferredAttribute对象,只有访问模型实例的字段时,才会获取到数据库存储的具体数值。直接用类字段与int值比较,必然触发类型不兼容的错误。
解决方法
将所有循环内的Extruder.xxx替换为extruder.xxx(注意循环变量是小写的extruder)。以下是关键代码修正示例:
原错误代码(LFT分支)
if film_width < int(Extruder.min_width): b.append(Extruder.name + ' : Film too narrow') elif film_width > int(Extruder.max_width): b.append(Extruder.name + ' : Film too wide') else: percentage = film_width / Extruder.max_width speed = Extruder.max_speed * percentage
修正后代码
if film_width < extruder.min_width: b.append(extruder.name + ' : Film too narrow') elif film_width > extruder.max_width: b.append(extruder.name + ' : Film too wide') else: percentage = film_width / extruder.max_width speed = extruder.max_speed * percentage
同样需要修正其他分支(SWS、DWS、JFS等)中所有类似错误:
Extruder.min_width→extruder.min_widthExtruder.max_width→extruder.max_widthExtruder.name→extruder.nameExtruder.max_speed→extruder.max_speed
注:代码中J-Fold分支存在未定义的strip_out变量,需自行补充定义,但不属于当前错误的核心原因。
内容的提问来源于stack exchange,提问作者Vinylnet
相关产品推荐
相关产品推荐

