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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 22:45:18