Flask 应用程序中更智能的 sqlalchemy wtf 动态过滤器
smarter sqlalchemy wtf dynamic filter in a flask app
我有一个过滤 table 的表单,我希望表单条目能够构建一个 sqlalchemy 语句。
因为我有选项 "No Filter",所以我不能只让表单字段进入过滤器 ('form field here')。但是必须有比像
这样的每个排列更好的方法
AT= list(set([h.assigned for h in models.Request.query.all()]))
AT.append('No Filter')
form.assigned.choices=zip(AT,AT)
requestlist= models.Request.query.all()
if form.validate_on_submit():
if form.status.data=='No Filter' and form.assigned.data=='No Filter' and form.requestor.data=='No Filter':
requestlist= models.Request.query.all()
elif form.status.data != 'No Filter' and form.assigned.data=='No Filter' and form.requestor.data=='No Filter':
requestlist = db.session.query(models.Request).filter(models.Request.status.like(form.status.data)).all()
elif form.status.data == 'No Filter' and form.assigned.data!='No Filter' and form.requestor.data=='No Filter':
requestlist = db.session.query(models.Request).filter(models.Request.assigned.like(form.assigned.data)).all()
elif form.status.data == 'No Filter' and form.assigned.data=='No Filter' and form.requestor.data!='No Filter':
requestlist = db.session.query(models.Request).filter(models.Request.requestedBy.like(form.requestor.data)).all()
elif form.status.data != 'No Filter' and form.assigned.data=='No Filter' and form.requestor.data!='No Filter':
requestlist = db.session.query(models.Request).filter(models.Request.requestedBy.like(form.requestor.data))\
.filter(models.Request.status.like(form.status.data)).all()
elif form.status.data == 'No Filter' and form.assigned.data !='No Filter' and form.requestor.data!='No Filter':
requestlist = db.session.query(models.Request).filter(models.Request.requestedBy.like(form.requestor.data))\
.filter(models.Request.assigned.like(form.assigned.data)).all()
elif form.status.data != 'No Filter' and form.assigned.data !='No Filter' and form.requestor.data =='No Filter':
requestlist = db.session.query(models.Request).filter(models.Request.status.like(form.status.data))\
.filter(models.Request.assigned.like(form.assigned.data)).all()
elif form.status.data != 'No Filter' and form.assigned.data !='No Filter' and form.requestor.data !='No Filter':
requestlist = db.session.query(models.Request).filter(models.Request.status.like(form.status.data))\
.filter(models.Request.requestedBy.like(form.requestor.data))\
.filter(models.Request.assigned.like(form.assigned.data)).all()
您可以一个接一个地添加多个filter(...)
个子句:
if form.validate_on_submit():
requestlist = models.Request.query
if form.status.data != 'No Filter':
requestlist = requestlist.filter(models.Request.status.like(form.status.data))
if form.assigned.data != 'No Filter':
requestlist = requestlist.filter(models.Request.assigned.like(form.assigned.data))
if form.requestor.data != 'No Filter':
requestlist = requestlist.filter(models.Request.requestedBy.like(form.requestor.data))
return requestlist.all()
或者更一般地说,您可以执行以下操作:
field_names = ['status', 'assigned', 'requestor']
if form.validate_on_submit():
requestlist = models.Request.query
for field in field_names:
f_value = getattr(form, field).data
if f_value != 'No Filter':
requestlist = requestlist.filter(getattr(models.Request, field).like(f_value))
return requestlist.all()
我看到的唯一问题是有时表格上的名称和模型不匹配。例如 requestedBy
和 requestor
。在这种情况下,您可以在 field_names
.
中定义字典而不是列表
我有一个过滤 table 的表单,我希望表单条目能够构建一个 sqlalchemy 语句。
因为我有选项 "No Filter",所以我不能只让表单字段进入过滤器 ('form field here')。但是必须有比像
这样的每个排列更好的方法AT= list(set([h.assigned for h in models.Request.query.all()]))
AT.append('No Filter')
form.assigned.choices=zip(AT,AT)
requestlist= models.Request.query.all()
if form.validate_on_submit():
if form.status.data=='No Filter' and form.assigned.data=='No Filter' and form.requestor.data=='No Filter':
requestlist= models.Request.query.all()
elif form.status.data != 'No Filter' and form.assigned.data=='No Filter' and form.requestor.data=='No Filter':
requestlist = db.session.query(models.Request).filter(models.Request.status.like(form.status.data)).all()
elif form.status.data == 'No Filter' and form.assigned.data!='No Filter' and form.requestor.data=='No Filter':
requestlist = db.session.query(models.Request).filter(models.Request.assigned.like(form.assigned.data)).all()
elif form.status.data == 'No Filter' and form.assigned.data=='No Filter' and form.requestor.data!='No Filter':
requestlist = db.session.query(models.Request).filter(models.Request.requestedBy.like(form.requestor.data)).all()
elif form.status.data != 'No Filter' and form.assigned.data=='No Filter' and form.requestor.data!='No Filter':
requestlist = db.session.query(models.Request).filter(models.Request.requestedBy.like(form.requestor.data))\
.filter(models.Request.status.like(form.status.data)).all()
elif form.status.data == 'No Filter' and form.assigned.data !='No Filter' and form.requestor.data!='No Filter':
requestlist = db.session.query(models.Request).filter(models.Request.requestedBy.like(form.requestor.data))\
.filter(models.Request.assigned.like(form.assigned.data)).all()
elif form.status.data != 'No Filter' and form.assigned.data !='No Filter' and form.requestor.data =='No Filter':
requestlist = db.session.query(models.Request).filter(models.Request.status.like(form.status.data))\
.filter(models.Request.assigned.like(form.assigned.data)).all()
elif form.status.data != 'No Filter' and form.assigned.data !='No Filter' and form.requestor.data !='No Filter':
requestlist = db.session.query(models.Request).filter(models.Request.status.like(form.status.data))\
.filter(models.Request.requestedBy.like(form.requestor.data))\
.filter(models.Request.assigned.like(form.assigned.data)).all()
您可以一个接一个地添加多个filter(...)
个子句:
if form.validate_on_submit():
requestlist = models.Request.query
if form.status.data != 'No Filter':
requestlist = requestlist.filter(models.Request.status.like(form.status.data))
if form.assigned.data != 'No Filter':
requestlist = requestlist.filter(models.Request.assigned.like(form.assigned.data))
if form.requestor.data != 'No Filter':
requestlist = requestlist.filter(models.Request.requestedBy.like(form.requestor.data))
return requestlist.all()
或者更一般地说,您可以执行以下操作:
field_names = ['status', 'assigned', 'requestor']
if form.validate_on_submit():
requestlist = models.Request.query
for field in field_names:
f_value = getattr(form, field).data
if f_value != 'No Filter':
requestlist = requestlist.filter(getattr(models.Request, field).like(f_value))
return requestlist.all()
我看到的唯一问题是有时表格上的名称和模型不匹配。例如 requestedBy
和 requestor
。在这种情况下,您可以在 field_names
.