Flask模型中choices字段的使用方法——Django转Flask开发者咨询
在Flask(SQLAlchemy)中实现类似Django的choices字段功能
Flask中常用的ORM是SQLAlchemy,没有Django那种原生的choices参数,但可以通过以下方式实现相同效果:
1. 定义选项常量
和Django一样,先定义存储值与显示值对应的元组:
from flask_sqlalchemy import SQLAlchemy db = SQLAlchemy() class ListAlbum(db.Model): # 格式:(数据库存储值, 业务/前端显示值) LIST_OF_ALBUM = ( ('shakira', 'Shakira'), ('don_jazy', 'Don Jazy'), ('psquare', 'Psquare') ) id = db.Column(db.Integer, primary_key=True) # 定义字符串字段,长度和你原Django配置一致 name = db.Column(db.String(20), nullable=False)
2. 添加显示值获取方法
模拟Django的get_xxx_display()方法,方便快速获取存储值对应的显示文本:
class ListAlbum(db.Model): # ... 上述代码 ... def get_name_display(self): # 把选项元组转成字典,通过存储值映射显示值 choice_map = dict(self.LIST_OF_ALBUM) # 找不到对应值时,返回原存储值作为兜底 return choice_map.get(self.name, self.name)
使用示例:
album = ListAlbum.query.first() print(album.get_name_display()) # 输出对应显示值,比如Shakira
3. 数据合法性验证
为避免存入非法值,可以从两个层面做限制:
数据库层面(Check约束)
在定义字段时添加CheckConstraint,强制数据库只允许存储选项内的值:
name = db.Column(db.String(20), nullable=False, db.CheckConstraint( f"name IN ({', '.join([repr(val) for val, _ in LIST_OF_ALBUM])})" ))
表单层面(WTForms验证)
如果用WTForms处理前端提交,直接把选项传给SelectField,自动生成下拉选择框并验证提交值:
from flask_wtf import FlaskForm from wtforms import SelectField class AlbumForm(FlaskForm): name = SelectField('专辑名称', choices=ListAlbum.LIST_OF_ALBUM)
这样前端只能选择预设选项,后端也会自动验证提交值的合法性。
内容的提问来源于stack exchange,提问作者Adamu Abdulkarim Dee
相关产品推荐
相关产品推荐

