2010-01-14 49 views
0

AUTOMATICALLY隨機字符串我想用戶名字段自動填充此值:插入在用戶名字段

username = str(n); 

其中n是一個數字(自動遞增或隨機)。

我試圖在保存方法補充一點:

username = str(random.randint(0,1000000) 

但有一個衝突問題時n是2級的用戶是相同的。

我該怎麼做?

+1

你可以做一個後保存的信號,並填寫從PK的用戶名在它 – 2010-01-14 19:43:32

+1

或者你可以把用戶名變成等於屬性self.pk – 2010-01-14 19:44:16

回答

1

生成它 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; 
+0

它會導致堆棧溢出達到1000000個用戶 – 2010-01-14 14:47:45

+0

這是真的。我沒有說它是完美的,我只回答他的問題:) – kjagiello 2010-01-14 18:16:04

+3

我沒有說你錯了,我只是說,在這種特殊情況下,一個普通的循環將會減少記憶飢餓:) – 2010-01-14 19:39:27

1

基於安東尼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') 
+1

你不增加'我' – 2016-08-22 13:16:32

3

下面是修改後的版本生成用戶名方法,允許您創建更多人類可讀的用戶名,以防萬一您將其用作任何用途的標識符。

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

+1這是一個非常好的解決方案,如果長度已減少到4或5 ;-) – Houman 2012-10-08 11:03:37