Python 简化动态sqlalchemy迭代request.args
我很难把这些东西拼在一起。我从表单POST中获取值表单中的name/id是数据库表中的实际列名 这里的想法是过滤级联select2输入,以创建一个动态过滤器。例如,我当前的3个选择名称是字段名称。如果我选择I字段,我只想提供该字段中的名称。如果未选择任何字段,我将提供所有名称(等等)。显然,生产模型将有2个以上 我试图迭代request.args以获取名称和值,然后添加到过滤器中。下面是我的代码Python 简化动态sqlalchemy迭代request.args,python,flask,flask-sqlalchemy,Python,Flask,Flask Sqlalchemy,我很难把这些东西拼在一起。我从表单POST中获取值表单中的name/id是数据库表中的实际列名 这里的想法是过滤级联select2输入,以创建一个动态过滤器。例如,我当前的3个选择名称是字段名称。如果我选择I字段,我只想提供该字段中的名称。如果未选择任何字段,我将提供所有名称(等等)。显然,生产模型将有2个以上 我试图迭代request.args以获取名称和值,然后添加到过滤器中。下面是我的代码 @bp.route('/wells/name') def wells_name(): if
@bp.route('/wells/name')
def wells_name():
if request.args:
qry = Wells.query
for var in request.args:
qry = qry.filter(getattr(Wells, var) == request.args['{}'.format(var)])
query = qry.with_entities(Wells.name).group_by(Wells.name).order_by(Wells.name)
else:
query = Wells.query.with_entities(Wells.name).group_by(Wells.name) \
.order_by(Wells.name)
我使用以下代码来获取变量的值
request.args['{}'.format(var)]
以下代码表示Wells.variablename(此场景中的Wells.field或Wells.name)
下面的例子试图“把所有的东西放在一起”。好的,这个问题肯定不是我所预料的。在过滤迭代之前,我移动了带有_实体的对象,它解决了这个问题。我确信仍然有改进的余地,但比我之前所做的有了很大的改进。这是新代码
@bp.route('/wells/name')
def wells_name():
if request.args:
query = Wells.query.with_entities(Wells.field, Wells.name) \
.group_by(Wells.field, Wells.name).order_by(Wells.name)
for var in request.args:
query = query.filter(getattr(Wells, var) \
.ilike('%{}%'.format(request.args['{}'.format(var)])))
else:
query = Wells.query.with_entities(Wells.name).group_by(Wells.name) \
.order_by(Wells.name)
还有旧代码
@bp.route('/wells/name')
def wells_name():
if 'field' in request.args and 'name' not in request.args:
field = request.args['field']
query = Wells.query.filter(Wells.field.ilike('%{}%'.format(field))) \
.with_entities(Wells.name).group_by(Wells.name).order_by(Wells.name)
elif 'field' not in request.args and 'name' in request.args:
name = request.args['name']
query = Wells.query.filter(Wells.name.ilike('%{}%'.format(name))) \
.with_entities(Wells.name).group_by(Wells.name).order_by(Wells.name)
elif 'field' in request.args and 'name' in request.args:
field = request.args['field']
name = request.args['name']
query = Wells.query.filter(Wells.field.ilike('%{}%'.format(field)), \
Wells.name.ilike('%{}%'.format(name))) \
.with_entities(Wells.name).group_by(Wells.name).order_by(Wells.name)
else:
query = Wells.query.with_entities(Wells.name).group_by(Wells.name) \
.order_by(Wells.name)
如果有更多的变量,“旧代码”显然会显著增加,甚至只增加第三个
@bp.route('/wells/name')
def wells_name():
if 'field' in request.args and 'name' not in request.args:
field = request.args['field']
query = Wells.query.filter(Wells.field.ilike('%{}%'.format(field))) \
.with_entities(Wells.name).group_by(Wells.name).order_by(Wells.name)
elif 'field' not in request.args and 'name' in request.args:
name = request.args['name']
query = Wells.query.filter(Wells.name.ilike('%{}%'.format(name))) \
.with_entities(Wells.name).group_by(Wells.name).order_by(Wells.name)
elif 'field' in request.args and 'name' in request.args:
field = request.args['field']
name = request.args['name']
query = Wells.query.filter(Wells.field.ilike('%{}%'.format(field)), \
Wells.name.ilike('%{}%'.format(name))) \
.with_entities(Wells.name).group_by(Wells.name).order_by(Wells.name)
else:
query = Wells.query.with_entities(Wells.name).group_by(Wells.name) \
.order_by(Wells.name)