Я работаю над проектом 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})
Спасибо
Спасибо, работает отлично. – rich
Здесь нет гонки? Что делать, если есть одна и та же запись в базу данных между 'exists()' check и 'save()'? – Mitar