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

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

你可能感兴趣的:(Django)