2017-05-24 67 views
0

假设我有2个模型。 Model_A和Model_B。Django:动态模型在创建后消失

每当管理员用户对model_A的对象进行更改时,都会点击“保存”按钮。

因此,当发生“保存”时,我想发送post_save信号,创建一个从Model_B继承的模型。

当我这样做的时候,模型确实会被创建,但是在刷新页面后它们会消失,有时它们会在刷新后再次出现。但他们并不总是留在名单上。 (奇怪,我知道了!)

所以对于post_save信号的代码是像这样:

post_save.connect(create_new_model, sender=Model_A) 

我create_new_model就像这样:

def create_new_model(sender, instance, **kwargs): 
    attrs = { 
     'field1': models.CharField(max_length=40), 
     'field2': models.CharField(max_length=40), 
     '__module__': 'appname.models' 
    } 

    from appname.models import create_model, admin_options, modelsList 

    mod = create_model(name=str(len(modelsList)), 
         fields=attrs, 
         admin_opts=admin_options 
         ) 
    modelsList.append(mod) 

最后,创建该函数动态模型(create_model)就像这样:

def create_model(name, fields=None, admin_opts=None): 

    from appname.models import Model_A 

    attrs = fields 

    model = type(name, (Model_A,), attrs) 

    if admin_opts is not None: 
     admin.site.register(model, admin_opts) 

    return model 

有没有人知道为什么这个偷偷摸摸的事情可能会发生?

回答

2

这可能是因为您的服务器使用多个进程而发生的。任何动态类只存在于创建它的过程中;即使这样,它也不会在整个重新启动过程中持续存在。

我不知道你的用例在这里,但这当然不是这样做的方式。

+0

有道理。有没有办法保持这些模型? – cookiedough

+0

不是。您需要在流程启动时重新创建所有内容,例如在AppConfig.ready中。你为什么这样做? –

+0

Model_B的每个实例都从Amazon S3中检索特定的一组数据。所以我想让用户说出他们想从桶中获取什么数据。 – cookiedough