2016-06-14 59 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(...)创建一个新的唯一键的实例并分配到该实例。