flask中的部分查询操作

filter

比较

filter中支持 python中的所有比较运算符: ==!=><>=<=

from flask_restful import Resource, reqparse, marshal_with
from .models import Goods
from .fields import goods_fields


class GoodsView(Resource):

   @marshal_with(goods_fields)
   def get(self):
       # 1. 客户端传递 参数,
       parser = reqparse.RequestParser()
       parser.add_argument('sales', type=int, location=['args'], default=0)
       
       sales = parser.parse_args().get('sales')
       

       # 2. 查询销量大于该参数的所有商品
       goods = Goods.query.filter(Goods.sales > sales).all()
       return goods

注意: 过滤完成之后,还需要调用 all()获取 查询的 结果

逻辑

from flask_restful import Resource, reqparse, marshal_with
from .models import Goods
from .fields import goods_fields
from sqlalchemy import or_, and_, not_


class GoodsView(Resource):

   @marshal_with(goods_fields)
   def get(self):
       # 1. 客户端传递 参数,

       parser = reqparse.RequestParser()
       parser.add_argument('sales', type=int, location=['args'], default=0)
       parser.add_argument('stock', type=int, location=['args'], default=0)

       sales = parser.parse_args().get('sales')
       stock = parser.parse_args().get('stock')

       # 2. 查询销量大于 某个数 或 库存小于 某个数 的商品信息
       goods = Goods.query.filter(or_(Goods.sales > sales, Goods.stock < stock)).all()

       return goods

 

from flask_restful import Resource, reqparse, marshal_with
from .models import Goods
from .fields import goods_fields
from sqlalchemy import or_, and_, not_


class GoodsView(Resource):
   @marshal_with(goods_fields)
   def get(self):
       # 1. 客户端传递 参数
       parser = reqparse.RequestParser()
       parser.add_argument('max_price', type=float, location=['args'])
       parser.add_argument('min_price', type=float, location=['args'])

       max_price = parser.parse_args().get('max_price')
       min_price = parser.parse_args().get('min_price')

       if (max_price is None) and (min_price is None):
           # 上限 和 下限 都没有
           goods = Goods.query.all()
           
       elif (max_price is None) and (min_price is not None):
           # 有 下限 ,没有 上限
           goods = Goods.query.filter(Goods.price >= min_price).all()
           
       elif (max_price is not None) and (min_price is None):
           # 有 上限 ,没有 下限
           goods = Goods.query.filter(Goods.price <= max_price).all()
           
       else:
           # 查询 价格在某个区间的商品信息
           goods = Goods.query.filter(and_(Goods.price >= min_price, Goods.price <= max_price)).all()

       return goods

 

  • 模型类.query.filter(模型类.字段 > 值).all(): 比较查询,支持所有比较运算符

  • 模型类.query.filter(or_(条件1, 条件2)).all(): 满足任何一个条件即可

  • 模型类.query.filter(and_(条件1, 条件2)).all(): 满足全部条件即可

  • 模型类.qery.filter(模型类.字段.in_([1, 2, 3, 4])): 查询某个字段是否 在某个 集合中,用来实现 批量操作

判断

# 查询库存不为空 的商品信息
goods = Goods.query.filter(not_(Goods.stock.is_(None))).all()
goods = Goods.query.filter(~(Goods.stock.is_(None))).all()


# id在某个区间的商品信息
goods = Goods.query.filter(Goods.id.in_([1, 3, 6, 7])).all()

模糊查询

from flask_restful import Resource, reqparse, marshal_with
from .models import Goods
from .fields import goods_fields


class GoodsView(Resource):

   @marshal_with(goods_fields)
   def get(self):
       #
       parser = reqparse.RequestParser()
       parser.add_argument('text', type=str, location=['args'])

       text = parser.parse_args().get('text')
       # sql语句中的模糊查询中,
       # %: 代表 任意个任意字符
       # _: 代表一个任意字符

       # 查询商品名包含xxx的商品信息
       # goods = Goods.query.filter(Goods.name.like('%{}%'.format(text))).all()

       # 查询 以 xx 开头 的商品信息
       goods = Goods.query.filter(Goods.name.like('{}%'.format(text))).all()

       return goods

排序

from flask_restful import Resource, reqparse, marshal_with
from .models import Goods
from .fields import goods_fields
from sqlalchemy import desc, asc


class GoodsView(Resource):

   @marshal_with(goods_fields)
   def get(self):
       # 接收客户端发送的参数,按照参数进行排序
       parser = reqparse.RequestParser()
       parser.add_argument('params', type=str, location=['args'])

       params = parser.parse_args().get('params')

       if params == 'price':
           goods = Goods.query.order_by('price').all()
       elif params == '-price':
           goods = Goods.query.order_by(desc('price')).all()
       elif params == 'sales':
           goods = Goods.query.order_by('sales').all()
       elif params == '-sales':
           goods = Goods.query.order_by(desc('sales')).all()
       else:
           goods = Goods.query.all()

       return goods

desc(字段): 按照字段 降序排序

asc(字段): 按照字段升序排序,不写asc也是升序排序

posted @ 2021-06-04 09:08  DoomLs  阅读(222)  评论(0)    收藏  举报