我需要为每个用户生成唯一的帐户ID(仅数字)
UUID无法解决此问题,请帮助我!
这里是您需要的内容。
import random
import string
''.join(random.choice(string.digits) for _ in range(8))
使用Python 3.6的random.choices()函数可以更加简洁地实现。
import random
import string
''.join(random.choices(string.digits, k=8))
避免可能的冲突:
尝试使用生成的ID创建新对象,如果遇到完整性错误,请重新创建ID。
例如 -
def create_obj():
id = ''.join(random.choices(string.digits, k=8))
try:
MyModel.objects.create(id=id)
except IntegrityError:
create_obj()
或者
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)
ALTER TABLE user AUTO_INCREMENT = 10000000;
您可以将此代码放入您的自定义迁移中,参见manage.py makemigrations --empty
我认为其他数据库也有类似的方法
from django.utils.crypto import get_random_string
def generate_account_id():
return get_random_string(8, allowed_chars='0123456789')
secrets.token_hex(nbytes)
这个函数来获取十六进制值字符串,然后将其转换为数字。为了进一步检测冲突,您还可以检查在Django模型中是否已经存在具有该ID的实例(如接受的回答所示)。import secrets
hexstr = secrets.token_hex(4)
your_id = int(hexstr, 16)
id
有什么问题? - Willem Van Onsem