2014-09-14 13 views
5

Ho notato lo strano comportamento del valore predefinito nel modello django. Per esempio abbiamo un semplice modello django:UUID come valore predefinito nel modello Django

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

Quando creo un nuovo utente, e dopo che un altro genere:

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

Django fa 2 utenti con lo stesso activation_key

Ma poi lo faccio così:

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

Tutto funziona bene e d Django crea 2 utenti con diverse chiavi di attivazione.

Cosa sta succedendo qui? Python carica l'oggetto modello e calcola il valore predefinito del modello all'avvio dell'app wsgi o in quello? Perché uuid dà gli stessi valori nel primo caso ma in secondo in secondo?

Grazie.

+1

Come cita @Rohan, ha bisogno di essere un callable. Ecco la documentazione pertinente https://docs.djangoproject.com/en/dev/ref/models/fields/#default – karthikr

risposta

16

problema è l'attributo default che si sta configurando come

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

Qui si imposta il valore predefinito non un callable ma il valore restituito da uuid.uuid1() chiamata quando questa classe del modello viene inizializzato.

Si dovrebbe impostare come default=uuid.uuid1 che lo imposta come chiamabile, e viene impostato nuovo uuid ogni volta che è necessario utilizzare il nuovo valore predefinito.

Problemi correlati