2010-10-13 4 views
2

Je travaille sur un projet Django où une Chose aurait une clé unique à 10 chiffres, en plus du champ entier ID incrémentation automatique standard. J'utilise une fonction de nombre aléatoire simple pour le créer. [Je suis sûr qu'il y a une meilleure façon de le faire aussi.]Django, générant automatiquement des champs de modèle uniques et appelant automatiquement un générateur automatique si ce n'est pas unique

Lorsqu'une chose est créée, une clé à 10 chiffres est créée. J'utilise le .validate_unique() pour vérifier l'unicité de la clé. Si ce n'est pas unique, existe-t-il un moyen simple d'appeler récursivement le générateur de clé (makeKey()) jusqu'à ce qu'il passe? Code suit:

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}) 

Merci

Répondre

6

Pas besoin de récursion ici - une base en boucle fera l'affaire.

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

Merci, fonctionne parfaitement. – rich

+1

N'y a-t-il pas une condition de concurrence ici? Que faire s'il y a la même entrée dans la base de données entre 'exists()' check et 'save()'? – Mitar

Questions connexes