我需要为每个用户生成唯一的帐户 ID。(只有数字)UUID 不能解决这个问题,请帮帮我!
干得好
import random
import string
''.join(random.choice(string.digits) for _ in range(8))
Run Code Online (Sandbox Code Playgroud)
使用 random.choices() 使用 python 3.6 甚至更短
import random
import string
''.join(random.choices(string.digits, k=8))
Run Code Online (Sandbox Code Playgroud)
避免可能的冲突:
尝试使用生成的 id 创建一个新对象,除了完整性错误,再次创建 id。
例如。——
def create_obj():
id = ''.join(random.choices(string.digits, k=8))
try:
MyModel.objects.create(id=id)
except IntegrityError:
create_obj()
Run Code Online (Sandbox Code Playgroud)
或者
def create_unique_id():
return ''.join(random.choices(string.digits, k=8))
def create_object():
id = create_unique_id()
unique = False
while not unique:
if not MyModel.objects.get(pk=id):
unique = True
else:
id = create_unique_id()
MyModel.objects.create(id=id)
Run Code Online (Sandbox Code Playgroud)
感谢 @WillemVanOnsem 指出生成重复 id 的机会,我提供的两个示例将根据需要多次创建新 id 以获得唯一 id,但随着数据库中的行数增加,获得一个的时间唯一 id 会越来越多,并且当您的数据库中有如此多的记录(10^8)时,当无法使用 8 位 uid 创建新记录时,因为所有可能的组合已经存在,所以您将在尝试创建新对象时陷入无限循环。
如果我的 Willem 提供的统计数据是正确的,我说这些变化太高了。所以我建议不要自己创建 id,使用 django 的默认自动字段或 uuid 来保证空间和时间的唯一性。