Python 基于逻辑的SQLAlchemy过滤器
我有一个烧瓶应用程序,它使用SQLAlchemy。对于其中一个端点Python 基于逻辑的SQLAlchemy过滤器,python,flask,sqlalchemy,Python,Flask,Sqlalchemy,我有一个烧瓶应用程序,它使用SQLAlchemy。对于其中一个端点“/items”,我想返回一个项目列表 这很容易ItemModel.query.all()其中ItemModel是表示项的类 但是假设我想允许url查询字符串参数,例如'/items?type=book' 如果我硬编码,那么使用TopicModel.query.filter\u by(type=book.all())将非常简单。 对于多个选项,它可以是TopicModel.query.filter\u by(type=book)。
“/items”
,我想返回一个项目列表
这很容易ItemModel.query.all()
其中ItemModel
是表示项的类
但是假设我想允许url查询字符串参数,例如'/items?type=book'
如果我硬编码,那么使用TopicModel.query.filter\u by(type=book.all())将非常简单。
对于多个选项,它可以是TopicModel.query.filter\u by(type=book)。filter\u by(color=yellow)。all()
但是,如果用户在查询字符串中提供了一个参数,我如何才能有效地生成该查询,使其只按该参数进行过滤
像这样的工作需要吗?如果是这样的话,它会对数据库执行多个请求(因此速度慢且资源密集型)
这是你的代码
def get(self):
type = request.args.get('type')
color = request.args.get('color')
size = request.args.get('size')
query = ItemModel.query.all()
if type:
query = query.filter_by(type=type).all()
if color:
query = query.filter_by(color=color).all()
if size:
query = query.filter_by(size=size).all()
return {'items' : query }
请看看这个。
在将所有条件应用于查询之前,不应获取所有条件
def get(self):
type = request.args.get('type')
color = request.args.get('color')
size = request.args.get('size')
query_obj = ItemModel.query
if type:
query_obj = query_obj.filter_by(type=type)
if color:
query_obj = query_obj.filter_by(color=color)
if size:
query_obj = query_obj.filter_by(size=size)
return {'items' : query_obj.all() }
非常感谢。您知道这是否会向数据库发出4个单独的请求吗?不知道。当您第一次调用ItemModel.query.all()时,只有一个请求发送到数据库。毕竟,在某些情况下,你只需要在变量值中进行筛选。只是尝试了一下,但我得到了一个错误:AttributeError:“list”对象没有属性“filter_by”。你的方法应该绝对有效。注意参数的类型和数据库。query.all()创建SQL查询并返回一个类似于列表的项,它在文档中写道。@MennoHölscher要确认一下:在我上面的方法中,它只会执行一个SQL查询?关于参数类型和数据库,您能详细说明我需要注意的事项吗?谢谢,只有一个问题。至于类型:请求参数是字符串。如果数据库中的字段是整数,则需要将参数作为整数传递给筛选器。能否从每个If语句中删除.all(),以完成重写的目标?您的初始方法是stellar,不运行然后过滤,而是过滤然后运行,但是“if color:”部分中的.all()将返回记录…我已经更新了它,应该可以正常工作@请现在检查
def get(self):
type = request.args.get('type')
color = request.args.get('color')
size = request.args.get('size')
query_obj = ItemModel.query
if type:
query_obj = query_obj.filter_by(type=type)
if color:
query_obj = query_obj.filter_by(color=color)
if size:
query_obj = query_obj.filter_by(size=size)
return {'items' : query_obj.all() }