【问题标题】:smarter sqlalchemy wtf dynamic filter in a flask app烧瓶应用程序中更智能的 sqlalchemy wtf 动态过滤器
【发布时间】:2023-03-05 20:48:01
【问题描述】:

我有一个过滤表的表单,我希望表单条目构建一个 sqlalchemy 语句。

因为我有“无过滤器”选项,所以我不能只让表单域进入过滤器(“此处的表单域”)。但是必须有比做每一个排列更好的方法

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()

【问题讨论】:

    标签: python flask sqlalchemy flask-wtforms


    【解决方案1】:

    您可以一个接一个地添加多个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()
    

    我看到的唯一问题是,有时表单上的名称和模型上的名称不匹配。一个例子是requestedByrequestor。在这种情况下,您可能会在 field_names 中定义字典而不是列表。

    【讨论】:

    • 问题不在于多个过滤子句。我希望我可以编写一个 sqlalchemy 查询,无论选择过滤器术语还是选择“无过滤器”,例如filter(*all) 当“无过滤器”时使用过滤器术语。谢谢你的例子!
    • 我认为问题在于将排列的数量从二次(8 = 2**3)减少到线性(仅 3),这已经完成。因此,如果您再添加两个过滤器,您将只需要再添加两行,总共 5 行,而不是总共 32 (2**5)。但可以肯定的是,您可以将其改进为更通用。让我尝试扩展答案...
    • 我刚刚更新了我原来的问题,使其更加清晰。对不起,我把你赶走了。另外,再次感谢您的帮助。我一个人工作,您对我的 q 和其他人的回答非常有帮助!稍后我会删除此评论,但要特别感谢!
    • 不客气。添加了另一种答案供您考虑。
    • 这个问题是可以选择过滤器的任何组合,所以这一次只允许过滤一个表单字段,对吗? form.status.data != '无过滤器' 和 form.assigned.data !='无过滤器' 和 form.requestor.data !='无过滤器'。
    猜你喜欢
    • 1970-01-01
    • 2016-04-12
    • 2021-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-17
    • 1970-01-01
    相关资源
    最近更新 更多