AUTOMATICALLY隨機字符串我想用戶名字段自動填充此值:插入在用戶名字段
username = str(n);
其中n
是一個數字(自動遞增或隨機)。
我試圖在保存方法補充一點:
username = str(random.randint(0,1000000)
但有一個衝突問題時n
是2級的用戶是相同的。
我該怎麼做?
AUTOMATICALLY隨機字符串我想用戶名字段自動填充此值:插入在用戶名字段
username = str(n);
其中n
是一個數字(自動遞增或隨機)。
我試圖在保存方法補充一點:
username = str(random.randint(0,1000000)
但有一個衝突問題時n
是2級的用戶是相同的。
我該怎麼做?
生成它 username = str(random.randint(0,1000000)
並檢查用戶與這樣的名字 User.objects.get(username=username)
如果您發現有人,生成一個新的。
def GenerateUsername():
username = str(random.randint(0,1000000))
try:
User.objects.get(username=username)
return GenerateUsername()
except User.DoesNotExist:
return username;
它會導致堆棧溢出達到1000000個用戶 – 2010-01-14 14:47:45
這是真的。我沒有說它是完美的,我只回答他的問題:) – kjagiello 2010-01-14 18:16:04
我沒有說你錯了,我只是說,在這種特殊情況下,一個普通的循環將會減少記憶飢餓:) – 2010-01-14 19:39:27
基於安東尼Hatchkins意見,我最近實施了類似的算法中,想我會後反饋,失敗保護,而不是遞歸循環無保護:
def GenerateUsername():
i = 0
MAX = 1000000
while(i < MAX):
username = str(random.randint(0,MAX))
try:
User.objects.get(username=username)
except User.DoesNotExist:
return username
i+=1
raise Exception('All random username are taken')
你不增加'我' – 2016-08-22 13:16:32
下面是修改後的版本生成用戶名方法,允許您創建更多人類可讀的用戶名,以防萬一您將其用作任何用途的標識符。
from random import choice
from string import ascii_lowercase, digits
from django.contrib.auth.models import User
def generate_random_username(length=16, chars=ascii_lowercase+digits, split=4, delimiter='-'):
username = ''.join([choice(chars) for i in xrange(length)])
if split:
username = delimiter.join([username[start:start+split] for start in range(0, len(username), split)])
try:
User.objects.get(username=username)
return generate_random_username(length=length, chars=chars, split=split, delimiter=delimiter)
except User.DoesNotExist:
return username;
+1這是一個非常好的解決方案,如果長度已減少到4或5 ;-) – Houman 2012-10-08 11:03:37
你可以做一個後保存的信號,並填寫從PK的用戶名在它 – 2010-01-14 19:43:32
或者你可以把用戶名變成等於屬性self.pk – 2010-01-14 19:44:16