CASCADE: 级联操作。
如果外键那条数据删除了,这条数据也将被删除PROTECT: 受保护,只要这条数据引用了外键的那条数据,旧不能删除外键数据,如果强行删除,Django框架将报错SET_NULL: 设置为空,如果外键数据被删除,本条数据设置为空,条件是 可以设置本条数据为空SET_DEFAULT: 设置默认值,如果外键数据删除了,设置这个数据的值为默认,条件是有默认值SET()函数: 如果外键那条数据被删除,那么将会获取SET函数的值作为外键的值。
Set()函数可以接管可调用工具,可调用工具的返回值作为结果设置回去。
DO_NOTHING: 不采纳任何行为,统统看数据库级别的行为。

数据库层面的约束:

PESTRICT: 默认选项,如果要删除父表记录,如果子表有关联记录,则不许可删除NOACTION:同上,首先检测外键CASCADE: 父表delete,update时,子表关联操作 也进行 delete,updateSET NULL:父表delete , update时,子表将关联记录外键字段设置为null,以是设计子表时不能 not null

这些外键的方法工具,可以帮助利用者处理多表关联查询任务。

1.1 如何在django中查询分页

在有分页查询的运用中,包括 LIMIT 和 OFFSET 的查询十分常见,而且险些每个都会有一个 ORDER BY 子句。

如果利用索引排序的话将对性能优化十分有帮助,否则做事端须要做很多文件排序。

大年夜量数据若何做分页处理

一个高频的问题是 offset 的值过大。
如果查询类似 LIMIT 10000, 20,将会产生10020行,并将之前的10000行丢弃,这样的代价很高。

select from table order by id limit 10000, 20;

很大略,该语句的意思便是查询10000+20条记录,去掉前10000条,返回后20条。
无疑该查询能够实现分页,但10000这位置的值越大,查询性能就越低,由于MySQL须要扫描全部10000+20条记录。

假设所有的页利用相同的频次访问,这样的查询将均匀扫描一半数据表。
为了优化他们,你可以在分页视图中限定最多可访问的页数,或者让大批量的查询更有效。

当一个表中有很多符合查询条件的数据的时候,我们每每不须要把他们全部一次性取出来,那样对查询效率或者做事器性能来说都会是一个极大的寻衅:例如最大略的商城,假设商城中有一万个数据,但我们在前端可能只会每次看到一页.

select from table where xxx="xxx" limit 10;

这表示查询符合条件的10个数据。

select from table where xxx="xxx" limit 10 offset 10;

这表示分页,查询符合条件的第11到20的数据。

或者通过指定最大id去查询

select from table where id > #max_id# order by id limit n;

该查询同样会返回后n条记录,却无需像办法1扫描前m条记录,但必须在每次查询时拿到上一次查询(上一页)的最大id(或最小id),是比较常用的办法。

当然该查询的问题也在于,如果最大id不是连续的,则我们不一定能拿到这个id,比如当前在第3页,须要查询第5页的数据,就弗成了。

或者通过子查询,先筛选前10000个,找到最大id,然后选择剩余的20个符合哀求的

select from table where id > (select id from table order by id limit m, 1) limit n;

该查询同样是通过子查询扫描字段id, 由于它不须要进行表的关联,而是一个大略的比较,在不知道上一页最大id的情形下,是比较推举的用法。

旁边连接的办法本身性能可能更差。
还有如下子查询、连接表,加索引快速定位元组,然后再读取元组

SELECT FROM table WHERE id <= (SELECT id FROM table ORDER BY id DESC LIMIT (page-1)pagesize ORDER BY id DESC LIMIT pagesize)

rest_framework 内建了分页的操作模块,让我们来运用到详细函数即可 employee/views.py

from rest_framework.pagination import PageNumberPagination@api_view(['GET', 'POST']) @permission_classes([CustomPermission])def blog_api_view(request): """""" if request.method == "GET":paginator = PageNumberPagination() # paginator.page_size = 1 setting we display only 1 item per page. paginator.page_size = 2 task_objects = EmployeeSign.objects.all() result = paginator.paginate_queryset(task_objects, request)

如果不该用分页,将显示全部的在同一个页面

serializer = TaskSerializer(result, many=True) return Response(serializer.data)

访问分页数据.默认接口http://127.0.0.1:2001/api/tasks/ 便是分页1

http://127.0.0.1:2001/api/tasks/?page=1 #2,3,4...2 小结

再重复一次,在有分页查询的运用中,包括 LIMIT 和 OFFSET 的查询十分常见,而且险些每个都会有一个 ORDER BY 子句。
如果利用索引排序的话将对性能优化十分有帮助,否则做事端须要做很多文件排序。

一个高频的问题是 offset 的值过大。
如果查询类似 LIMIT 10000, 20,将会产生10020行,并将之前的10000行丢弃,这样的代价很高。

假设所有的页利用相同的频次访问,这样的查询将均匀扫描一半数据表。

为了优化他们,你可以在分页视图中限定最多可访问的页数,或者让大量的查询更有效。

关注#华为云开拓者同盟# 点击下方,第一韶光理解华为云新鲜技能~

华为云博客_大数据博客_AI博客_云打算博客_开拓者中央-华为云