Django中多条件复杂查询解决方案

在项目中难免会遇到复杂的条件查询,(1个条件,2个条件,多个条件),想想都头大… 那有没有简单的、灵活的方法呢,答案是True。其实Q对象就可以满足需求,网上也有很多其他的方法,都可以实现,可以一起来看一下我之前写的项目中的案例。

希望有幸帮助到需要的你,欢迎指正~

view.py(后台逻辑代码)
# 店铺商品
def mygoods(request, shop_id):
    if request.method == "GET":
        try:
        	# 卖家数量范围区间
            seller_volume_from = request.GET.get('seller_volume_from')
            seller_volume_to = request.GET.get('seller_volume_to')
            # 评论数量范围区间
            comment_volume_from = request.GET.get('comment_volume_from')
            comment_volume_to = request.GET.get('comment_volume_to')
            # 上传时间范围区间
            upload_date_from = request.GET.get('upload_date_from')
            upload_date_to = request.GET.get('upload_date_to')
            # 关键词模糊查询
            search_amazon = request.GET.get('search_amazon')
			
			# ***********************************************************************
			
            # 定义一个总的Q对象,把下边的q1,q2对象添加进去
            con = Q()
            q1 = Q()
            q1.connector = 'AND' # q1对象表示‘AND’关系,也就是说q1下的条件都要满足‘AND’
            # 判断前台传过来的值是否存在,存在的话追加到去Q对象中,不存在的话可以赋一个空值
            if comment_volume_from:
                q1.children.append(('comment_volume__gte', int(comment_volume_from)))
            else:
                comment_volume_from = ""

            if comment_volume_to:
                q1.children.append(('comment_volume__lte', int(comment_volume_to)))
            else:
                comment_volume_to = ""

            if seller_volume_from:
                q1.children.append(('seller_volume__gte', int(seller_volume_from)))
            else:
                seller_volume_from = ""

            if seller_volume_to:
                q1.children.append(('seller_volume__lte', int(seller_volume_to)))
            else:
                seller_volume_to = ""
			
			# 对时间类型的查询进行一个转换格式的处理(str转date)
            if upload_date_from:
                upload_date_from = datetime.strptime(upload_date_from, "%Y-%m-%d")
                upload_date_from = datetime.date(upload_date_from)
                q1.children.append(('upload_date__gte', upload_date_from))
            else:
                upload_date_from = ""

            if upload_date_to:
                upload_date_to = datetime.strptime(upload_date_to, "%Y-%m-%d")
                upload_date_to = datetime.date(upload_date_to)
                q1.children.append(('upload_date__lte', upload_date_to))
            else:
                upload_date_to = ""
			
			# ***********************************************************************
			
            q2 = Q()
            q2.connector = 'OR' # q2对象表示‘OR’关系,也就是说q2下的条件都要满足‘OR’
            if search_amazon:
                search_amazon = search_amazon.strip() # 去除字符串左右空格
            
                # 加上‘__contains’表示包含,可以达成模糊查询的目的,目前模糊查询只对这两个
                # 字段进行匹配,如果有多个的话就往下边继续添加,如果不是模糊查询去掉‘__contains’即可
                q2.children.append(('product_name__contains', search_amazon))
                q2.children.append(('ASIN__contains', search_amazon))
            else:
                search_amazon = ""
                
            # 把q1和q2对象添加到总的Q对象
            con.add(q1, 'AND')
            con.add(q2, 'AND')

			# ***********************************************************************

            # 查询数据(把con这个总的Q对象添加到filter过滤条件中,还可以在con后边继续添加过滤条件)
            goods = MapMyShopGoods.objects.filter(con, shop=shop_id)
            
            # 调用分页
            goods_list = mygoods_page_goods(request, goods)['goods_list']
            page_list = mygoods_page_goods(request, goods)['page_list']
            goods_count = goods.count()

            return render(request, 'amazonshop/mygoods.html', locals())
        except Exception as e:
            print('店铺商品---', e, str(e.__traceback__.tb_lineno))
            return render(request, 'amazonshop/mygoods.html', locals())

你可能感兴趣的:(总结,技术,Django,Python,多条件查询,Q对象)