Flask将选择形式转换为指向另一个表的ForeignKey

时间:2018-08-05 07:23:58

标签: postgresql flask flask-sqlalchemy flask-wtforms

该应用程序的这一部分有效,但丑陋且不可持续。需要更完善的解决方案。

我要解决的问题:

应用程序的此部分使用户可以访问表单以输入他们进行的购买并将其存储在Postgres DB中。我正在使用Flask SQLAlchemy ORM。 在我的babel : The term 'babel' is not recognized as the name of a cmdlet ( ..etc ) 表中存在一个字段purchase,该字段与我的store_id表具有ForeignKey关系。我不希望用户在表单中选择商店ID#,因此我正在使用SelectField来使他们能够选择商店名称。但是,我似乎找不到一种可持续的方式将商店名称转换回其关联的ID。现在,我正在使用下面显示的难看的IF语句。

将商店名称映射/转换为ID的更好方法是什么?该ID已存储在数据库的“商店”表中?

我的模型:

store

我的表格:

class Purchase(db.Model):
id = db.Column(db.Integer, primary_key=True)
item = db.Column(db.String(80))
quantity = db.Column(db.Integer)
unit_cost = db.Column(db.Integer)
total_cost= db.Column(db.Integer)
date = db.Column(db.DateTime)
store_id = db.Column(db.Integer, db.ForeignKey('store.id'))

我的路线:

class CreatePurchase(FlaskForm):

item = StringField('Item', validators=[DataRequired()])
quantity = IntegerField('Quantity', validators=[DataRequired()])
unit_cost = IntegerField('Unit Cost', validators=[DataRequired()])
total_cost = IntegerField('Total Cost', validators=[DataRequired()])
store_id = SelectField("Store Selector", choices=[('0','Select Store'),('1','Furgesons'), ('2','Ocean State'), ('3','Chewy'), ('4','Amazon'),  ('5', 'Rumford')])
date = DateField('Purchase Date', validators=[DataRequired()])
submit = SubmitField('Enter')

1 个答案:

答案 0 :(得分:1)

您有一个SQLiteOpenHelper表,其中带有数字ID(作为PK)和名称属性:

store

您使用class Store(db.Model): store_id = .. store_name = .. 中的所有 unique 值填充表单。这需要是一种动态生成的表单,因此与其使用静态创建的表单,不如执行以下操作:

store_name

然后def CreatePurchase() class TempForm(FlaskForm): item = StringField('Item', validators=[DataRequired()]) quantity = IntegerField('Quantity', validators=[DataRequired()]) unit_cost = IntegerField('Unit Cost', validators=[DataRequired()]) total_cost = IntegerField('Total Cost', validators=[DataRequired()]) date = DateField('Purchase Date', validators=[DataRequired()]) submit = SubmitField('Enter') choices = ## some SQLalchemy code to get all unique store_names from the table TempForm.store_id = SelectField("Store Selector", choices=choices) return TempForm() 将提供正确的ID,但以表格形式显示商店的字符串名称。

此设置中的关键是确保您使用正确的SQLalchemy代码动态填充SelectField。基本上,对于表中的每个商店,您都可以通过以下方式进行迭代:

form.store_id
相关问题