蓝鲸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

Bd20-5-42.png

请注意,"Orders" 表中的 "P_Id" 列指向 "Persons" 表中的 "P_Id" 列。

"Persons" 表中的 "P_Id" 列是 "Persons" 表中的 PRIMARY KEY。

"Orders" 表中的 "P_Id" 列是 "Orders" 表中的 FOREIGN KEY。


FOREIGN KEY 约束用于预防破坏表之 间连接的动作

FOREIGN KEY 约束也能防止非法数据 插入外键列,因为它必须是它指向的那 个表中的值之一

基本查询

Bd20-5-43.png

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日志记录