Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 基于逻辑的SQLAlchemy过滤器_Python_Flask_Sqlalchemy - Fatal编程技术网

Python 基于逻辑的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)。

我有一个烧瓶应用程序,它使用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)。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() }