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

如何让Django的get_random_string仅返回数值?相关ID字段如何选型?

Django get_random_string生成纯数字随机串及ID字段方案

调整代码生成纯数值结果

django.utils.crypto.get_random_string 支持通过 allowed_chars 参数自定义允许使用的字符集,你只需要将字符集限定为0-9的数字即可获得纯数值的随机结果,示例代码如下:

from django.utils.crypto import get_random_string

# 生成长度为10的纯数字随机字符串
random_num_str = get_random_string(10, allowed_chars='0123456789')
# 如果需要整数类型直接转换即可
random_num = int(random_num_str)

运行上述代码即可获得你期望的类似1067603657的结果。

对应ID字段推荐方案

这类随机ID适合不需要自增特性、需要隐藏业务数据量级的场景,常用的字段方案如下:

  • 字符串类型ID方案:使用CharField作为主键,适配随机字符串的生成结果,不需要额外做类型转换,示例代码:
from django.db import models
from django.utils.crypto import get_random_string

def generate_random_numeric_id(length=10):
    return get_random_string(length, allowed_chars='0123456789')

class YourModel(models.Model):
    id = models.CharField(
        primary_key=True,
        max_length=10,
        default=generate_random_numeric_id,
        editable=False,
        unique=True
    )
    # 其他业务字段

    # 可选:重写save方法处理极小概率的ID重复问题
    def save(self, *args, **kwargs):
        if not self.id:
            while True:
                candidate_id = generate_random_numeric_id()
                if not YourModel.objects.filter(id=candidate_id).exists():
                    self.id = candidate_id
                    break
        super().save(*args, **kwargs)
  • 整数类型ID方案:如果你需要ID为数值类型,使用BigIntegerField作为主键即可,Python的整数无长度限制,Django的BigIntegerField可支持最大到9223372036854775807的数值,足够容纳18位以内的纯数字随机ID,不会出现溢出问题,生成ID后转换为整数赋值即可。
  • 优化建议:如果业务量级较大,可将随机ID长度调整为12~16位,ID重复的概率会降低到几乎可以忽略,不需要额外做重复校验也能满足生产环境要求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.11 10:12:03