2010-08-20 16 views
6

Tengo un modelo que se ve algo como esto¿Valor predeterminado aleatorio/no constante para el campo del modelo?

class SecretKey(Model): 
    user = ForeignKey('User', related_name='secret_keys') 
    created = DateTimeField(auto_now_add=True) 
    updated = DateTimeField(auto_now=True) 
    key = CharField(max_length=16, default=randstr(length=16)) 
    purpose = PositiveIntegerField(choices=SecretKeyPurposes) 
    expiry_date = DateTimeField(default=datetime.datetime.now()+datetime.timedelta(days=7), null=True, blank=True) 

Se dará cuenta de que el valor por defecto para key es una cadena de 16 caracteres al azar. El problema es que creo que este valor se almacena en caché y se usa varias veces seguidas. ¿Hay alguna manera de que pueda obtener una cuerda diferente cada vez? (No me preocupan las singularidades/colisiones)

+1

debe aplicar la respuesta de Daniel al 'expiry_date' también. No obtendrás el resultado deseado con el código actual. –

+0

@ [iquadrat: Sí ... lo noté también. Gracias. – mpen

Respuesta

10

Sí, el valor predeterminado solo se establece cuando se inicializa la metaclass Model, no cuando se crea una nueva instancia de SecretKey.

Una solución es hacer que el valor predeterminado sea callable, en cuyo caso se llamará a la función cada vez que se cree una nueva instancia.

def my_random_key(): 
    return randstr(16) 

class SecretKey(Model): 
    key = CharField(max_length=16, default=my_random_key) 

Se podría, por supuesto, también se establece el valor en función del modelo de __init__, pero callables son más limpios y seguirá funcionando con la sintaxis estándar como model = SecretKey(key='blah').

+2

Podría golpear un 'lambda:' delante para hacer que se llame, ¿o no? – mpen

+0

sí, pensé en eso después de publicar :) –

+0

por cierto, me encantaría utilizar las instancias 'F()' como valores predeterminados. Debo dejar de ser flojo y llenar un ticket en http://code.djangoproject.com ... algún día – alanjds

Cuestiones relacionadas