蓝鲸Django:数据分页、复杂查询和日志记录
来自CloudWiki
数据分页方法
前端分页:Datatables, kendo等
后端分页:
- 逻辑实现
- paginator分页
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
重要方法:
- Paginator(objects, one_page_nums)
- Paginator对象
- p.page(current_page) #当前页面的属性
- a.object_list #元素列表
代码:
>>> from django.core.paginator import Paginator >>> objects = ['john', 'paul', 'george' 'ringo'] >>> p = Paginator(objects, 2) >>> p.page(1) <Page 1 of 2> >>> a = p.page(1) >>> a <Page 1 of 2> >>> a.object_list ['john', 'paul']
复杂查询
Model外键
一个表中的 FOREIGN KEY 指向另一个 表中的 PRIMARY KEY
请注意,"Orders" 表中的 "P_Id" 列指向 "Persons" 表中的 "P_Id" 列。
"Persons" 表中的 "P_Id" 列是 "Persons" 表中的 PRIMARY KEY。
"Orders" 表中的 "P_Id" 列是 "Orders" 表中的 FOREIGN KEY。
FOREIGN KEY 约束用于预防破坏表之 间连接的动作
FOREIGN KEY 约束也能防止非法数据 插入外键列,因为它必须是它指向的那 个表中的值之一
基本查询
1. awards = Award.objects.filter(name contains='qb') 2. awards = Award.objects.filter(name contains='qb', organization name=u'腾讯科技') 3. awards = Award.objects.filter(name contains='qb', state=1) 4. awards = Award.objects.filter(name contains='qb', start_time gte='2017-12-01', end_time lte='2017-12-03')
复杂查询-filter
过滤关键字 含义 SQL contains 包含 where field like“%test%” startswith 以..开头 where field like“test%” gt, gte 大于,大于等于 where field > 10 lt, lte 小于,小于等于 where field < 10 range=[a,b] a,b两者之间 where field between a and b in=(a, b) 值属于列表中的值 where field in (a,b)
1.awards = Award.objects.filter(name contains='qb') 2.awards = Award.objects.filter(name startswith='qb') 3.awards = Award.objects.filter(name endswith='qb') 4.awards = Award.objects.filter(applicant_num range=[10,20])
排除
Award.objects.filter(name contains="qb").exclude(is_delete=1)
排序
Award.objects.all().order_by('start_time')
去重
Award.objects.all().values('name').distinct()
总数
Award.objects.all().count()
复杂查询-Q查询
在filter中使用Q表达式进行更复杂的查询
可通过操作符 |(或),& (与),~ (非)来组合Q表达式
Award.objects.filter(Q(name contains=“qb”) & Q(level=2)) Award.objects.filter(Q(name istartswith=“qb”)|Q(applicant_num Award.objects.filter(~Q(name startswith=“qb”))
日志记录
可参考Python日志记录