typeerror:'在<string>'中需要字符串作为左操作数,而不是list -flask和sqlacmey

时间:2019-11-28 00:47:18

标签: python validation flask flask-sqlalchemy

我是python的新手,它试图防止将未知值推送到名为Tasks的数据库表中,而这不是我的其他名为Terms的表中的值(使用term_parent ==“ site_type”通过site_type查询)。

当我尝试循环“条款”表中的数据并针对输入task_site_type对其进行验证时,如果只选择所有项目并且交换了{{1} }语句我得到了错误:if not

Flask-sqlalchemy请求需要循环的数据。

typeerror: 'in <string>' requires string as left operand, not list

从选中的复选框中抓取POSTED列表。

terms_site_type = Terms.query.filter(Terms.term_parent == "site_type").all()

我必须验证的最近的东西  没有错误-当我全选时,  if request.method == 'POST': # Gather Form Input task_site_type = request.form.getlist('task_site_type') e.g selecting two checkboxes task_site_type = ['Test1', 'All'] task_site_type

的循环完全匹配
terms_site_type

错误  形成此设置,该设置应验证针对数据库“条款”循环发布的内容

for term in terms_site_type:
                if not term.term_title in task_site_type:
                    errors['task_site_type_list'] = 'Please select from list'



 e.g term.term_title(list) 
    Test1
    Test2
    All

 task_site_type - ['Test1', 'Test2' 'All']

2 个答案:

答案 0 :(得分:0)

来自...的错误

                    if not task_site_type in term.term_title:
                        errors['task_site_type_list'] = 'Please select from list'

...是有效的错误,因为in中的左操作数是list,而右操作数是string。反之亦然。

同样,在您以前的代码中,我相信您将遍历Tasks并检查来自Terms的列表,因为这是正确的验证方法。

正确的方法如下:

for task in task_site_type:
                if not task in terms_site_type:
                    errors['task_site_type_list'] = 'Please select from list'

答案 1 :(得分:0)

我的第一个答案就可以了,但是更好的方法可能是同时获得两个列表,将它们转换为集合,然后减去任务减去术语。

您可以定义如下函数:

def Diff(li1, li2): 
    return (list(set(li1) - set(li2))) 

Diff(tasks, terms) 
# if the resulting list is empty then the validation shall succeed

参考:https://www.geeksforgeeks.org/python-difference-two-lists/

最后, 更好的方法是将输入列表(即任务)推入查询过滤器本身,以便将验证带到数据库本身,而不是在代码中进行验证。