即使未提供参数,基本查询也能正常工作
Base query to work even if parameters not supplied
我使用多个参数进行搜索。其中一些是可选的。
在这个例子中,为了简单起见,我只使用了两个。
如果 industry_id
是 None
我会出现这个错误:
invalid input syntax for integer: ""
LINE 3: WHERE companies_company.industry_id = ''
pagination = Company.query.filter((Company.industry_id == industry_id) & (Company.size == size)).paginate(
page, per_page=current_app.config['POSTS_PER_PAGE'],
error_out=False)
我的问题是,我需要有倍数 if else 以及所有可能的组合?在这种情况下,过滤器具有:
if not size:
Company.query.filter((Company.industry_id == industry_id
elif not industry_id:
Company.query.filter((Company.size == size
else:
Company.query.filter((Company.industry_id == industry_id & Company.size == size
...
这很难维护,因为我有超过 2 个选项,这意味着 if 和 else 的许多组合。即使过滤器的元素是 none?
也可以保持基本查询正常工作的任何替代方法
您不必在一行中构建整个查询。您可以随时构建它。
query = Company.query
if size:
query = query.filter(Company.size == size)
if industry_id:
query = query.filter(Company.industry_id == industry_id)
result = query.all()
如果您觉得这太冗长,您可以构建一个过滤器列表,然后将它们全部传递给 filter()
。
filters = []
if size:
filters.append(Company.size == size)
if industry_id:
filters.append(Company.industry_id == industry_id)
result = Company.query.filter(*filters).all()
根据获取值 size
和 industry_id
的方式进一步减少输入,您可以使用列表理解。
fields = ('size', 'industry_id')
filters = [getattr(Company, field) == request.form.get(field) for field in fields]
result = Company.query.filter(*filters).all()
我使用多个参数进行搜索。其中一些是可选的。 在这个例子中,为了简单起见,我只使用了两个。
如果 industry_id
是 None
我会出现这个错误:
invalid input syntax for integer: ""
LINE 3: WHERE companies_company.industry_id = ''
pagination = Company.query.filter((Company.industry_id == industry_id) & (Company.size == size)).paginate(
page, per_page=current_app.config['POSTS_PER_PAGE'],
error_out=False)
我的问题是,我需要有倍数 if else 以及所有可能的组合?在这种情况下,过滤器具有:
if not size:
Company.query.filter((Company.industry_id == industry_id
elif not industry_id:
Company.query.filter((Company.size == size
else:
Company.query.filter((Company.industry_id == industry_id & Company.size == size
...
这很难维护,因为我有超过 2 个选项,这意味着 if 和 else 的许多组合。即使过滤器的元素是 none?
也可以保持基本查询正常工作的任何替代方法您不必在一行中构建整个查询。您可以随时构建它。
query = Company.query
if size:
query = query.filter(Company.size == size)
if industry_id:
query = query.filter(Company.industry_id == industry_id)
result = query.all()
如果您觉得这太冗长,您可以构建一个过滤器列表,然后将它们全部传递给 filter()
。
filters = []
if size:
filters.append(Company.size == size)
if industry_id:
filters.append(Company.industry_id == industry_id)
result = Company.query.filter(*filters).all()
根据获取值 size
和 industry_id
的方式进一步减少输入,您可以使用列表理解。
fields = ('size', 'industry_id')
filters = [getattr(Company, field) == request.form.get(field) for field in fields]
result = Company.query.filter(*filters).all()