2010-08-20 4 views
6

J'ai un modèle qui ressemble à ceciValeur par défaut aléatoire/non constante pour le champ du modèle?

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) 

Vous remarquerez que la valeur par défaut pour key est une chaîne aléatoire de 16 caractères. Le problème est, je pense que cette valeur est mise en cache et utilisée plusieurs fois de suite. Est-il possible que je puisse obtenir une chaîne différente à chaque fois? (Je ne me soucie pas de l'unicité/des collisions)

+1

Vous devez également appliquer la réponse de Daniel à 'expiry_date'. Vous n'obtiendrez pas le résultat souhaité avec le code actuel. –

+0

@ [iquadrat: Oui ... j'ai remarqué ça aussi. Merci. – mpen

Répondre

10

Oui, la valeur par défaut ne sera définie que lorsque la métaclasse modèle est initialisée, pas lorsque vous créez une nouvelle instance de SecretKey.

Une solution consiste à définir la valeur par défaut callable, auquel cas la fonction sera appelée chaque fois qu'une nouvelle instance est créée.

def my_random_key(): 
    return randstr(16) 

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

Vous pouvez, bien sûr, également définir la valeur en __init__ fonction du modèle, mais appelables sont plus propres et fonctionne toujours avec vous une syntaxe standard comme model = SecretKey(key='blah').

+2

Je pourrais juste gifler un 'lambda:' devant pour le rendre appelable, n'est-ce pas? – mpen

+0

ouais, j'ai pensé à cela après que j'ai posté :) –

+0

btw, j'aimerais utiliser les instances 'F()' comme valeurs par défaut. Je devrais arrêter d'être paresseux et aller remplir un ticket sur http://code.djangoproject.com ... un jour – alanjds

Questions connexes