导读:本期聚焦于小伙伴创作的《Django如何用UUIDField替代自增ID作为主键防止数据遍历》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《Django如何用UUIDField替代自增ID作为主键防止数据遍历》有用,将其分享出去将是对创作者最好的鼓励。

在Django项目里,默认的主键是自增的整数ID,这种ID有规律可循,很容易被攻击者通过遍历ID的方式批量获取系统内的数据,存在数据泄露的风险。使用UUID作为主键可以有效避免这个问题,因为UUID没有规律,几乎不可能被遍历猜测。

Django如何用UUIDField替代自增ID作为主键防止数据遍历

UUIDField基础介绍

Django内置了UUIDField字段类型,专门用来存储UUID值,它在数据库层面会对应合适的UUID存储类型,比如PostgreSQL的uuid类型,SQLite的char(32)类型等。UUID是通用唯一识别码,由32个十六进制字符组成,通过特定的算法生成,重复概率极低。

配置UUID作为主键的步骤

1. 定义模型时使用UUIDField作为主键

在模型的属性定义中,声明id字段为UUIDField,设置primary_key=True,同时指定默认值为生成UUID的函数,避免使用自增ID。以下是基础的用户模型示例:

import uuid
from django.db import models

class User(models.Model):
    # 设置UUID为主键,默认值为uuid.uuid4生成的新UUID
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    username = models.CharField(max_length=30, unique=True)
    create_time = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return self.username

这里的editable=False表示该字段在后台管理界面等场景中不可编辑,default=uuid.uuid4会在创建新实例时自动生成唯一的UUID值,不需要手动赋值。

2. 执行数据库迁移

定义好模型之后,需要执行Django的迁移命令让配置生效:

python manage.py makemigrations
python manage.py migrate

如果是已经存在的项目,原本使用的是自增ID主键,需要先处理原有数据,再修改主键配置,否则迁移过程会出现冲突,建议先备份数据再操作。

3. 关联表的外键配置

如果其他模型需要关联这个UUID主键的模型,外键字段会自动适配UUID类型,不需要额外特殊配置,示例如下:

import uuid
from django.db import models

class User(models.Model):
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    username = models.CharField(max_length=30, unique=True)

class Order(models.Model):
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    # 外键关联User模型,会自动使用UUID类型
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    order_no = models.CharField(max_length=50)

UUID主键的优缺点分析

优点

  • 防止ID遍历:UUID没有规律,攻击者无法通过递增的方式批量获取数据,提升数据安全性。
  • 分布式场景友好:不同服务生成的UUID不会冲突,适合分布式系统下的数据同步场景。
  • 不需要提前获取ID:生成UUID不需要依赖数据库的自增序列,减少数据库交互。

缺点

  • 存储空间更大:UUID字符串长度比整数长,会占用更多的数据库存储空间,尤其是数据量大的时候差异更明显。
  • 查询性能略低:UUID作为主键的索引效率比整数自增ID稍低,对查询性能有一定影响,不过在大部分中小型项目中差异可以忽略。
  • 可读性差:UUID是一串无意义的字符,调试的时候不如整数ID直观。

使用注意事项

首先,不要在业务逻辑中手动修改UUID主键的值,因为默认配置了editable=False,手动修改可能导致主键冲突。其次,如果项目数据量非常大,对查询性能要求极高,需要谨慎评估是否使用UUID主键,或者可以采用整数ID作为内部主键,对外暴露UUID作为业务标识的方案。最后,生成UUID的时候要使用uuid.uuid4()方法,不要使用基于时间戳或者MAC地址生成的UUID版本,避免泄露服务器相关信息。

DjangoUUIDFielduuid主键防止数据遍历修改时间:2026-06-21 01:33:31

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。