首页 > 数据库 > 数据库开发技术 > Django 中的外键处理与分页查询优化




1. 查询时外键的处理
在 Django 中,模型中可以通过 ForeignKey 来定义外键关联,并通过 on_delete 来决定关联对象删除时的行为:
from django.db import modelsclass ParentModel(models.Model):name = models.CharField(max_length=100)class ChildModel(models.Model):name = models.CharField(max_length=100)parent = models.ForeignKey(ParentModel, on_delete=models.CASCADE)

on_delete 的选项:
CASCADE:
PROTECT:
SET_NULL:
SET_DEFAULT:
SET():
DO_NOTHING:

数据库层级的外键约束:
RESTRICT:
CASCADE:
SET NULL:
NO ACTION:


2. 如何在 Django 中进行分页查询
分页查询是处理大量数据时的重要优化手段。常见的方法包括 LIMIT 和 OFFSET,配合 ORDER BY 子句使用。

1 使用 LIMIT 和 OFFSET
假设要分页获取数据:
SELECT * FROM table ORDER BY id LIMIT 10 OFFSET 20;以上查询会跳过前 20 行,返回第 21 到 30 行的记录。
然而,随着 OFFSET 值的增大,性能会显著下降,因为数据库需要扫描所有跳过的记录。

2 优化大偏移量分页
基于最大 ID 的分页
SELECT * FROM table WHERE id > {last_max_id} ORDER BY id LIMIT 10;子查询优化
SELECT *FROM tableWHERE id > (SELECT id FROM table ORDER BY id LIMIT 20, 1)LIMIT 10;
限制最大页数


3. 在 Django 中实现分页
Django 提供了内置分页工具,尤其是在 REST 框架中,分页处理变得更为简洁高效。

示例:分页查询员工数据
模型定义
from django.db import modelsclass Employee(models.Model):name = models.CharField(max_length=100)position = models.CharField(max_length=50)
使用 Django REST Framework 的分页功能
from rest_framework.pagination import PageNumberPaginationfrom rest_framework.decorators import api_view, permission_classesfrom rest_framework.response import Responsefrom rest_framework.permissions import IsAuthenticatedfrom .models import Employeefrom .serializers import EmployeeSerializerclass CustomPagination(PageNumberPagination):page_size = 5 # 每页显示 5 条数据page_size_query_param = 'size' # 允许用户通过参数调整每页大小def employee_list(request):queryset = Employee.objects.all().order_by('id')paginator = CustomPagination()page = paginator.paginate_queryset(queryset, request)serializer = EmployeeSerializer(page, many=True)return paginator.get_paginated_response(serializer.data)
访问分页接口
http://127.0.0.1:8000/api/employees/?page=1&size=10返回分页结果
{"count": 100,"next": "http://127.0.0.1:8000/api/employees/?page=2","previous": null,"results": [{"id": 1, "name": "Alice", "position": "Manager"},{"id": 2, "name": "Bob", "position": "Engineer"},...]}


小结
外键处理:
分页优化:
Django 实现:


👋 大家好,我是枫哥,一名Java后端开发者!我热衷于探索新技术,并在我的微信公众号上分享关于Java 生态和后端开发的知识。
欢迎关注我的公众号,期待与你一起探讨技术的无穷可能! ” 目前专注于Java技术分享,覆盖春招、秋招、社招和跳槽相关内容,并提供一对一带徒学习服务。
加入 学徒计划,即可享受内推机会和优质资源,签订协议确保就业无忧。
此外,我们还推出了‘Java跳槽网’, 为你的求职之路提供全方位支持,助你快速找到理想工作




原文作者:IT枫斗者;如有侵权,请联系管理员删除。