You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flask模型使用Enum类型报错:TypeError: object of type 'type' has no len()

Fixing TypeError When Using Python Enum with Flask-SQLAlchemy Column

我之前也碰到过这个问题,尤其是在Python 2.7搭配旧版SQLAlchemy的环境下——核心问题是旧版的SQLAlchemy没法直接识别Python的enum.Enum类,它会错误地把枚举类本身当成枚举值来处理,导致计算长度时抛出TypeError: object of type 'type' has no len()。

下面给你两种可行的解决方案,同时满足你对字段可筛选的需求:

方案1:手动传入枚举值集合(兼容所有旧版本)

直接把枚举成员的value提取出来传给db.Enum,同时指定数据库枚举类型的名称(避免自动生成的名称出现问题):

import enum
from flask_sqlalchemy import SQLAlchemy

db = SQLAlchemy()

class ValueTypes(enum.Enum):
    min = 'min'
    max = 'max'
    optimum = 'opt'

class Param(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    # 手动传入枚举值,指定数据库枚举类型名
    type = db.Column(
        db.Enum(*[vt.value for vt in ValueTypes], name='value_types'),
        default=ValueTypes.optimum.value  # 用枚举值作为默认值
    )

筛选用法:

不管是用枚举成员还是直接用字符串值,都能正常筛选:

# 用枚举成员对应的value筛选
optimum_params = Param.query.filter_by(type=ValueTypes.optimum.value).all()
# 直接用字符串值筛选
min_params = Param.query.filter_by(type='min').all()

方案2:使用SQLAlchemy的values_callable参数(推荐,兼容SQLAlchemy 1.1+)

如果你的SQLAlchemy版本在1.1及以上(Python 2.7最高支持到SQLAlchemy 1.3.x),可以用values_callable参数告诉SQLAlchemy如何提取枚举值,这样不用手动拼接值列表,还能直接用枚举成员作为默认值:

import enum
from flask_sqlalchemy import SQLAlchemy
from sqlalchemy import Enum as SAEnum  # 直接用SQLAlchemy的Enum类更灵活

db = SQLAlchemy()

class ValueTypes(enum.Enum):
    min = 'min'
    max = 'max'
    optimum = 'opt'

class Param(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    type = db.Column(
        SAEnum(ValueTypes, values_callable=lambda enum_cls: [e.value for e in enum_cls]),
        default=ValueTypes.optimum  # 直接用枚举成员作为默认值
    )

筛选用法:

这种方案下,你可以直接用枚举成员筛选,SQLAlchemy会自动转换为对应的数据库值:

# 直接用枚举成员筛选(更直观)
optimum_params = Param.query.filter_by(type=ValueTypes.optimum).all()
# 也可以用字符串值筛选
max_params = Param.query.filter_by(type='max').all()

为什么会报错?

你使用的Python 2.7对应的SQLAlchemy版本比较旧,旧版的db.Enum不支持直接传入Python标准库的enum.Enum类。它期望接收的是一组可计算长度的枚举值(比如字符串),但你传入了ValueTypes这个类本身,所以当它尝试计算len(x)时,x是枚举类而不是枚举值,自然就抛出了类型错误。

内容的提问来源于stack exchange,提问作者garmoncheg

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 06:52:59