类型错误:'in <string>'需要字符串作为左操作数,而不是列表 -flask 和 sqlacmey



我是python的新手,并试图防止将未知值推送到名为Tasks的数据库中,该表不是我另一个名为Terms的表中的值(使用term_parent=="site_type"通过site_type查询(。

当我尝试从 Term 表中循环数据并根据输入task_site_type对其进行验证时,我只能管理它,以便在选择所有项目时不抛出错误,如果我交换if not语句,我会收到错误:typeerror: 'in <string>' requires string as left operand, not list

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

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']

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

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

来自 ...

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'

我的第一个答案可以完成这项工作,但更好的方法可能是获取两个列表,将它们转换为集合并获得任务减去项的差异。

您可以定义如下所示的函数:

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/

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

相关内容

最新更新