Django, автоматическое создание уникальных полей модели и рекурсивный вызов автоматического генератора, если он не уникален - PullRequest
3 голосов
/ 14 октября 2010

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

Когда создается вещь, создается 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})

Спасибо

1 Ответ

8 голосов
/ 14 октября 2010

Здесь нет необходимости в рекурсии - базовый цикл while поможет.

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