如何生成唯一的 8 个长度的数字,例如帐户 ID (Python,Django)

Nur*_*hov 2 python django

我需要为每个用户生成唯一的帐户 ID。(只有数字)UUID 不能解决这个问题,请帮帮我!

Vai*_*hal 8

干得好

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 来保证空间和时间的唯一性。