如何让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
相关产品推荐
相关产品推荐

