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