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
Merci, fonctionne parfaitement. – rich
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