2010-08-20 61 views
6

我有一個模型,它看起來像這樣模型字段的隨機/非恆定默認值?

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) 

你會注意到,key的默認值是隨機的16個字符的字符串。問題是,我認爲這個值會被緩存並連續使用數次。有什麼辦法可以每次都得到不同的字符串嗎? (我不關心的唯一性/碰撞)

+1

您應該將Daniel的回答應用於'expiry_date'。目前的代碼不會得到期望的結果。 – 2010-08-21 23:14:47

+0

@ [iquadrat:是的...我也注意到了。謝謝。 – mpen 2010-08-23 06:25:25

回答

10

是,默認只會當Model元類初始化設置,而不是當你創建中SecretKey的新實例。

一種解決方案是使默認值callable,在這種情況下功能將每次創建新實例時調用。

def my_random_key(): 
    return randstr(16) 

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

你可以,當然,也設置在模型的__init__功能價值,但可調用的清潔,將仍與標準語法工作像model = SecretKey(key='blah')

+2

我可以在它前面打一個'lambda:'使它可以調用,不是嗎? – mpen 2010-08-20 22:41:33

+0

是啊,我想到後,我張貼:) – 2010-08-20 23:48:10

+0

順便說一句,我喜歡用'F()'實例作爲默認值。我應該退出懶惰,去填補http://code.djangoproject.com ...票一天 – alanjds 2012-11-21 23:57:19