You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Django中实现类似Spotify的URL哈希ID映射数据库功能?

Django中实现URL哈希ID替代自增ID的方案及搜索关键词

核心搜索关键词

直接搜这些关键词就能找到大量相关实现教程和讨论:

  • Django hashid URL
  • Django obfuscate primary key
  • Django slug for primary key
  • Django short UUID model field
  • Django base62 ID encoding

常用实现方式

1. 用第三方库快速实现

最省事的是用现成的第三方库,不用自己造轮子:

  • hashid-field:专门为Django设计的字段,自动将自增ID转为哈希字符串,支持双向映射。
    模型定义示例:

    from hashid_field import HashidAutoField
    
    class Track(models.Model):
        id = HashidAutoField(primary_key=True)
        title = models.CharField(max_length=200)
        # 其他字段
    

    视图里直接用哈希ID查询:

    track = Track.objects.get(id=request.GET.get('hash_id'))
    
  • django-shortuuidfield:生成短格式的UUID作为模型主键,同样可以直接放到URL里,避免暴露自增ID。

2. 自定义编码逻辑

如果想自己控制编码规则,可以基于base62(URL安全的字符集)实现双向转换:
先写编码解码函数:

import string

# 用大小写字母+数字组成URL安全的字符集
BASE62_CHARS = string.ascii_letters + string.digits

def encode_db_id(db_id):
    if db_id == 0:
        return BASE62_CHARS[0]
    chars = []
    while db_id > 0:
        db_id, remainder = divmod(db_id, 62)
        chars.append(BASE62_CHARS[remainder])
    return ''.join(reversed(chars))

def decode_hash_id(hash_str):
    db_id = 0
    for char in hash_str:
        db_id = db_id * 62 + BASE62_CHARS.index(char)
    return db_id

然后在视图中解码哈希ID再查询:

from django.shortcuts import get_object_or_404

def track_detail(request, hash_id):
    db_id = decode_hash_id(hash_id)
    track = get_object_or_404(Track, id=db_id)
    # 后续视图逻辑

内容的提问来源于stack exchange,提问作者Edward

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 06:43:10