2010-10-13 1 views
2

Я работаю над проектом Django, в котором Thing будет иметь уникальный 10-значный ключ, в дополнение к стандартным автоматически увеличивающимся ID-целым полям. Для его создания используется простая функция случайных чисел. [Я уверен, что есть лучший способ сделать это тоже]Django, создавая уникальные поля модели и рекурсивно вызывающий автогенератор, если не уникален

Когда создается Вещь, создается 10-значный ключ. Я использую .validate_unique(), чтобы проверить уникальность ключа. Если это не единственный, есть ли простой способ, я могу рекурсивно вызвать генератор ключей (makeKey()) до его прохода? Код следующим образом:

Models.py:

class Thing(models.Model): 
    name=models.CharField(max_length=50) 
    key=models.IntegerField(unique=True) 

Views.py:

def makeKey(): 
    key='' 
    while len(key)<10: 
     n=random.randint(0,9) 
     key+=`n` 
    k=int(key) 
    #k=1234567890 #for testing uniqueness 
    return k 

def createThing(request): 
    if (request.method == 'POST'): 
    f = ThingForm(request.POST) 
try: 
    f.is_valid() 
    newF=f.save(commit=False) 
    newF.key=makeKey() 
    newF.validate_unique(exclude=None) 
    newF.save() 
    return HttpResponseRedirect(redirect) 

except Exception, error: 
    print "Failed in register", error 
    else: 
     f = ThingForm() 
    return render_to_response('thing_form.html', {'f': f}) 

Спасибо

ответ

6

Нет необходимости рекурсии здесь - основное время цикла будет делать трюк.

newF = f.save() 
while True: 
    key = make_key() 
    if not Thing.objects.filter(key=key).exists(): 
     break 
newF.key = key 
newF.save() 
+0

Спасибо, работает отлично. – rich

+1

Здесь нет гонки? Что делать, если есть одна и та же запись в базу данных между 'exists()' check и 'save()'? – Mitar

Смежные вопросы