2014-09-14 10 views
5

Ich habe das seltsame Verhalten des Vorschlagswerts im Django-Modell bemerkt. Zum Beispiel haben wir ein einfaches django Modell:UUID als Standardwert in Django Modell

import uuid 
... 

class SiteUser(models.Model): 
    ... 
    username = models.CharField(max_length=255, verbose_name=u"Username") 
    activation_key = models.CharField(max_length=64, verbose_name=u"Activation key", default=uuid.uuid1()) 

Wenn ich einen neuen Benutzer zu erstellen, und danach ein anderer so:

user_a = SiteUser(username="UserA") 
user_a.save() 
user_b = SiteUser(username="UserB") 
user_b.save() 

Django macht 2 Benutzern mit dem gleichen activation_key

Aber dann mache ich es so:

user_a = SiteUser(username="UserA") 
user_a.activation_key = uuid.uuid1() 
user_a.save() 
user_b = SiteUser(username="UserB") 
user_b.activation_key = uuid.uuid1() 
user_b.save() 

Alles funktioniert gut d Django erstellt 2 Benutzer mit unterschiedlichen Aktivierungsschlüsseln.

Was geht hier vor? Python lädt das Modellobjekt und berechnet den Standardwert des Modells, wenn die wsgi-App gestartet wird oder? Warum gibt Uuid im ersten Fall die gleichen Werte, im zweiten aber anders?

Danke.

+1

Wie @Rohan erwähnt, ist es ein aufrufbar sein muss. Hier ist die relevante Dokumentation https://docs.djangoproject.com/en/dev/ref/models/fields/#default – karthikr

Antwort

16

Problem ist das default Attribut, das Sie Einstellung als

activation_key = models.CharField(max_length=64, verbose_name=u"Activation key", 
       default=uuid.uuid1()) 

Hier können Sie den Standardwert nicht aufrufbare setzen, sondern durch uuid.uuid1() Aufruf zurückgegebene Wert, wenn diese Modellklasse initialisiert wird.

Sie sollten es als default=uuid.uuid1 setzen, die es als aufrufbar setzt, und legt jedes Mal neue Uuid fest, wenn ein neuer Standardwert verwendet werden muss.