带有 UUID 的 Flask-WTF 选择域

Flask-WTF selectfield with UUID

我正在使用 sqlalchemy 并在我的数据库 (postgres) 中使用 UUID 作为主键

这是我的 class:

class EntityType(db.Model):
    __tablename__ = 'entity_type'

    id = db.Column(UUID(as_uuid=True), primary_key=True, server_default=db.text('gen_random_uuid()'))
    name = db.Column(db.Text, nullable=False)

在添加实体的表单中,用户必须选择实体类型,我有以下

class EntityAddForm(FlaskForm):

    url = StringField('URL', validators=[DataRequired(),URL(require_tld=True)])
    entity_type = SelectField('Entity type')
    description = TextAreaField('Description')
    submit = SubmitField('Add')

    def validate_entity_type(self, entity_type):
        entity_type = EntityType.query.filter_by(id=entity_type.data).first()
        if entity_type is None:
            raise ValidationError('Please select a different entity type.')

为了加载表单,我使用以下代码用 table.

的行填充 selectField
    form = EntityAddForm()
    form.entity_type.choices = [(et.id, et.name) for et in EntityType.query.order_by('name')]

问题是 if form.validate_on_submit(): 在提交时 return 不正确。

似乎 WTForms 需要一个 string/unicode/int 对 selectField

的 id 使用强制

有没有办法继续使用 UUID 类型而不是切换到整数来让 selectField 工作?

我尝试使用 QuerySelectEntity 或自定义 UUID 类型,但未能成功。

谢谢

您是否尝试过将您的数据库转换为字符串以使其在网络上表现良好:

def default_uuid():
    return uuid.uuid4().hex

class EntityType(db.Model):
    __tablename__ = 'entity_type'
    id = db.Column(db.String, primary_key=True, default=default_uuid)

在传递到 Web 以在表单中使用时明确转换数据:

form.entity_type.choices = [(str(et.id), et.name) for et in EntityType.query.order_by('name')]

def validate_entity_type(self, entity_type):
        entity_type = EntityType.query.filter_by(id=uuid.UUID(entity_type.data)).first()
        if entity_type is None:
            raise ValidationError('Please select a different entity type.')