带有UUID的Flask-WTF选择字段

问题描述 投票:0回答:1

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

这是我的课程:

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.')

要加载表单,我有以下代码用表中的行填充selectField。

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

问题是if form.validate_on_submit():在提交时未返回True。

似乎WTForms需要使用selecter的ID来强制使用一个字符串/ unicode / int

是否有一种方法可以继续使用UUID类型,而不是切换到整数以使selectField工作?

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

谢谢

python flask sqlalchemy flask-wtforms wtforms
1个回答
0
投票

您是否尝试过将数据库转换为字符串以使其在网络上都能正常播放:

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)

或[>]

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

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.')
© www.soinside.com 2019 - 2024. All rights reserved.