python SqlAlchemy数据库模型:访问列枚举值

wkyowqbh  于 2023-06-04  发布在  Python
关注(0)|答案(1)|浏览(178)

在模型中,我有:

class GenderEnum(enum.Enum):
    man = "ﻡﺭﺩ"
    woman = "ﺰﻧ"

class Users(db.Model, UserMixin):

    __tablename__ = 'Users'

    id = db.Column(db.Integer, primary_key=True)
    # Gender
    gender = db.Column(db.Enum(GenderEnum), unique=False, default="man")

然后,我尝试为mode_form方法定义一个自定义转换器,该方法提取枚举值作为用于在WTForm中显示字段的标签

@converts('Enum')
def conv_Enum(self, column, field_args, **extra):
    if 'choices' not in field_args:
        field_args['choices'] = [(e, e) for e in column.type.enums]
        assert False, field_args["choices"] 
    return f.SelectField(**field_args)

但是,我不知道如何访问这里的值(مرد,ن)来填充choices的(key,value)

xu3bshqb

xu3bshqb1#

(第一部分:我的个人意见)

为什么您无论如何都不能访问它们:

当你创建一个Enum列时,数据库(和模型)的该列的已知值将被设置为等于Enum变量的 name(常量变量的名称,而不是它们的值)。因此,Enum列知道Enum变量的值没有任何意义,因为首先,您试图将(مرد , زن)转换为(woman, man)

解决方法

我这样做的方式如下:
1.在模型类的内部定义枚举类。
1.使用column.class_.GenderEnum访问Enum类
所以你的重构代码应该是:

# model.py
class Users(db.Model, UserMixin):
    class GenderEnum(enum.Enum):
        man = "ﻡﺭﺩ"
        woman = "ﺰﻧ"

    __tablename__ = 'Users'

    id = db.Column(db.Integer, primary_key=True)
    # Gender
    gender = db.Column(db.Enum(GenderEnum), unique=False, default="man")

# <your_other_file>.py
@converts('Enum')
def conv_Enum(self, column, field_args, **extra):
    if 'choices' not in field_args:
        field_args['choices'] = [(e.name, e.value) for e in column.class_.GenderEnum]
        assert False, field_args["choices"] 
    return f.SelectField(**field_args)

注意,(e.name, e.value)将导致(man, مرد)(woman, زن)

相关问题