Django 做多级搜索&仅查找所需列(得到所需列的query_set)&下载

本文介绍了如何在Django中进行多级搜索,利用字典格式传入filter参数。同时,展示了如何获取模型实例的特定列,通过values方法获取一个包含指定列的字典列表。此外,还探讨了使用Q对象进行复杂条件搜索的方法,以及如何实现数据的下载功能。
def get_query_all(dic=None,values=None):
    res = oneModel.objects.filter(**dic).values(*values)
    return res
  1. 多级搜索: 将搜索项以字典格式传入filter,注意解包 **
  2. 得到所需的列:将所需列以列表形式传入values,得到一个字典列表[obj1,obj2,obj3]
实现下载功能:
obj = get_query_all(dic, header)
buf = BytesIO()     # from io import BytesIO
import openpyxl
appeal_wb = openpyxl.Workbook(encoding='utf-8',write_only=True)
ws = appeal_wb.create_sheet()
ws.append(list(header_dic.values()))
for row in obj:
    ws.append(list(row.values()))
appeal_wb.save(buf)
file = buf.getvalue()
response = HttpResponse(content_type='application/vnd.ms-excel')
response['Content-Disposition'] = 'attachment;filename=' + 'RebatePool' + '.xls'
response.write(file)
return response
使用Q做发杂条件搜索
con = Q()
q1 = Q()
q1.connector = 'OR'
q1.children.append(('id', 1))  # 传入一个元祖
q1.children.append(('id', 2))
q1.children.append(('id', 3))
q2 = Q()
q2.connector = 'OR'
q2.children.append(('name', 'xiaoming'))
con.add(q1, 'AND')
con.add(q2, 'AND')
models.Tb1.objects.filter(con).orderby('id')
def get_query_all(dic=None, values=None, limit=None):
    '''dic:搜索字段,同字段(year=2017,year=2018)为OR,不同字段间为AND关系(year和month)
    values为所需的字段(不需要整张表的全部字段)
    limit:(skip,skip+limit)'''
    con = Q()
    if dic:
        for k,v in dic.items():
            q1 = Q()
            q1.connector = 'OR'
            if v:
                for item in v:
                    q1.children.append(item)
            con.add(q1, 'AND')
    if limit:
        res = RebatePoolModel.objects.filter(~Q() & con).order_by('-extra__上传日期')[limit[0]:limit[1]].values(*values)
    else:
        res = RebatePoolModel.objects.filter(~Q() & con).order_by('-extra__上传日期').values(*values)
    return res
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值