2016-06-14 90 views
0

我想知道是否有可能像做以下Django的外鍵的新模型實例作爲默認

class ModelA(models.Model): 
    my_field = models.ForeignKey('UniqueKey', to_field='key' default=UniqueKey.create(key=KeyGen())) 
    # KeyGen() returns a new random key 

從本質上說,我有一些有一個唯一的32位密鑰作爲一個模型他們的領域。我創建了UniqueKey模型來管理所有這些密鑰,並確保不會出現重複。我試圖做的是創建一個新的UniqueKey實例,並在創建新的ModelA實例時將其保存到數據庫。

這是可能的還是我只是在這個錯誤的方式?

+0

@MosesKoledoye你的意思是這將是一個糟糕的形式,有一個數據庫條目,就像一個捕獲所有,然後有一個外鍵的默認值是該捕獲所有條目的ID? –

+0

如果默認值在遷移時可序列化,它應該可以工作。看看這個:https://docs.djangoproject.com/en/1.9/topics/migrations/#serializing-values –

+0

@MosesKoledoye ahhhhhh,我忘記了默認值實際上將成爲數據庫中的默認值並且數據庫不會知道如何創建新的模型實例。 –

回答

0

我認爲你最好的方法是在你的模型的一個實例被創建時使用post_save信號。 https://docs.djangoproject.com/en/1.9/ref/signals/#post-save

class ModelA(models.Model): 
    my_field = models.ForeignKey('UniqueKey', to_field='key') 

def set_default_uniquekey_for_modela(sender, instance, created, raw, using, update_fields): 
    if created is True: 
     new_unique_key = UniqueKey(key=KeyGen()) 
     new_unique_key.save() 
     instance.my_field = new_unique_key 
     instance.save() 

post_save.connect(set_default_uniquekey_for_modela, sender=ModelA) 

所以創建MODELA的實例時,它會exectute set_default_uniquekey_for_modela(...)創建一個新的唯一鍵的實例並分配到該實例。