Django-如何在页面之间传递动态模型

Django-如何在页面之间传递动态模型,django,django-models,Django,Django Models,我制作了一个django应用程序,可以动态创建模型和数据库表。据我所知,这是做我需要的事情唯一可行的方法。问题在于如何在页面之间传递动态创建的模型 我可以想出一些这样做的方法,但它们听起来都很可怕。我能想到的方法是: 在views.py中使用全局变量。这似乎是一个可怕的黑客行为,如果同时有多个用户,可能会导致冲突 在URL中传递一个引用,并使用一些评估黑客来尝试重新查找模型。这可能是愚蠢的,因为模型可能会在途中被垃圾收集 使用占位符应用程序。这似乎是个坏主意,因为多个用户之间存在冲突 有一个不可

我制作了一个django应用程序,可以动态创建模型和数据库表。据我所知,这是做我需要的事情唯一可行的方法。问题在于如何在页面之间传递动态创建的模型

我可以想出一些这样做的方法,但它们听起来都很可怕。我能想到的方法是:

  • 在views.py中使用全局变量。这似乎是一个可怕的黑客行为,如果同时有多个用户,可能会导致冲突
  • 在URL中传递一个引用,并使用一些评估黑客来尝试重新查找模型。这可能是愚蠢的,因为模型可能会在途中被垃圾收集
  • 使用占位符应用程序。这似乎是个坏主意,因为多个用户之间存在冲突
  • 有一个不可见的表单,当点击链接时发布模型。又一次非常讨厌 有没有一种好的方法可以做到这一点,如果没有,其中一种方法是否比其他方法更可行

    另外,它可以帮助我的应用程序从预先存在的数据库接收数据(作为json字符串),然后在本地(即在Web服务器上)缓存数据,动态创建适当的模型和表。然后,我们的想法是呈现这些数据,并对其进行各种过滤和深入研究,而不会对主数据库造成过度的压力(因为每个查询都会从一个包含数亿个数据点的数据库中返回几百个结果。)W.R.T.3,表的命名基于查询的哈希和时间戳,然而,占位符应用程序将具有预定的名称

    谢谢

    乔拉

    编辑添加:谢谢各位,我现在已经解决了这个问题。最后,我把两个答案结合起来,给出了一个完整的答案。由于我只能接受一个,我将接受contenttypes一个,遗憾的是,我还没有放弃投票的名声,但是如果/当我放弃投票时,我将努力返回并适当地放弃投票

    整体的解决方案

    from django.contrib.contenttypes.models import ContentType
    view_a(request):
        model = create_model(...)
        request.session['model'] =  ContentType.objects.get_for_model(model)
        ...
    
    view_b(request):
        ctmodel = request.session.get('model', None)
        if not ctmodel:
            return Http404
        model = ctmodel.model_class()
        ...
    

    我的第一个想法是使用内容类型,并通过url传递类型/模型信息

    我的第一个想法是使用内容类型,并通过url传递类型/模型信息

    您也可以使用Django's,例如

    您可以,而且管理它也很容易:

     del request.session['your_model']
    

    你也可以用Django's,例如

    您可以,而且管理它也很容易:

     del request.session['your_model']
    


    与其将数据复制到另一个数据库中,您是否考虑过使用Memcache或其他缓存层?您使用的应用程序名称是什么?理论上,我可以使用Memcache或类似的软件,但获得法律部门批准的新软件是一场噩梦。只做一个更容易。@Hassek我目前使用的应用程序名称是'query'+str(哈希(query+time.now())),但最终可能会改变。你能提供一些关于动态创建模型的方法的更多信息吗?不要将数据复制到另一个数据库中,你考虑过使用Memcache或其他缓存层吗?你使用的应用程序名称是什么?理论上我可以使用Memcache或类似的东西,但获得法律部门批准的新软件是一场噩梦。我自己做一个更容易。@Hassek我目前使用的应用程序名称是'query'+str(哈希(query+time.now())),但最终可能会改变。你能提供一些关于动态创建模型的方法的更多信息吗?这也是我的第一个想法。由于从未动态创建过模型,它是否会导致所有正常的事情发生,包括创建内容类型id?它似乎没有显示在contenttypes中。假设我可以添加它?好的,这样我就可以用
    django.contrib.contenttypes.models.ContentType.objects.get_for_model(model)
    为我的模型获取ContentType,其中model是我动态创建的模型。我如何利用它从另一个视图访问模型?你可以通过url将内容类型id和模型id传递给视图吗?事实证明你可以,但是,因为我使用哈希来生成非冲突名称,它会生成非常长、难看的url,由于它们的暂时性,无法重用。会话选项更干净。这也是我的第一个想法。由于从未动态创建过模型,它是否会导致所有正常的事情发生,包括创建内容类型id?它似乎没有显示在contenttypes中。假设我可以添加它?好的,这样我就可以用
    django.contrib.contenttypes.models.ContentType.objects.get_for_model(model)
    为我的模型获取ContentType,其中model是我动态创建的模型。我如何利用它从另一个视图访问模型?你可以通过url将内容类型id和模型id传递给视图吗?事实证明你可以,但是,因为我使用哈希来生成非冲突名称,它会生成非常长、难看的url,由于它们的暂时性,无法重用。会话选项更干净。显然,您不能动态地pickle模块。您得到:异常类型:PicklingError异常值:无法pickle:模块0F3CA88A74423FBBFFE7B39805D794的导入失败这是因为没有此类模块。如果我将pickle支持作为函数添加到模型中,那就足够了吗?经过一些研究和实验,结果证明,至少根据python文档,没有在顶层定义的函数是不可pickle的。有没有办法让会话使用封送处理或其变体来代替pickle?为什么不在会话中存储模型的PK,并从数据库中检索它?您也不能pickle属性对象。会话通过酸洗对象来工作。使用已加载模块的名称而不是虚构模块的名称是否有效?上的一个注释表明,这曾经是拥有动态模型的必要条件,有趣的是……显然,您不能动态地pickle模块。获取:异常类型:PicklingError异常值:无法pickle:导入