小编sin*_*ton的帖子

在Django框架中使用动态模型

我目前正在使用Django框架,包括其模型机制来抽象数据库模式声明和一般数据库访问,这在大多数情况下都能正常工作.

但是,我的应用程序还需要在运行时动态创建和访问表,据我所知,Django不支持开箱即用.
这些表通常具有相同的结构,并且基本上可以由相同的Model类抽象,但是Django不允许您更改某个模型查询的基础db_table,因为它在Model类上而不是在Manager上声明.

我的解决方案是每当我需要创建,填充和访问新表时执行此过程:

  • 使用原始sql创建并填充表
  • 使用原始sql向表中添加索引
  • 当我需要访问该表(使用django queryset api)时,我动态声明一个新类型并将其作为查询模型返回,使用以下代码:

    table_name = # name of the table created by sql
    model_name = '%d_%s' % (connection.tenant.id, table_name)
    try:
        model = apps.get_registered_model('myapp', model_name)
        return model
    except LookupError:
        pass
    
    logger.debug("no model exists for model %s, creating one" % model_name)
    class Meta:
        db_table = table_name
        managed = False
    
    attrs = {
       'field1' : models.CharField(max_length=200),
       'field2' : models.CharField(max_length=200),
       'field3' : models.CharField(max_length=200)
       '__module__': 'myapp.models',
       'Meta':Meta
    }
    
    model = type(str(model_name), (models.Model,), attrs)
    return model
    
    Run Code Online (Sandbox Code Playgroud)
  • 请注意,我确实检查模型是否已在django中注册,并且我正在使用现有模型.模型名称对于每个表始终是唯一的.由于我使用的是多租户,因此租户名称也是模型名称的一部分,以避免与在不同模式上声明的类似表冲突.

  • 如果不清楚:动态创建的表将永久保留以供将来的会话使用.

到目前为止,这个解决方案对我来说很好 但是,应用程序需要支持大量这些表.即10,000 …

python django postgresql django-models django-queryset

7
推荐指数
1
解决办法
7187
查看次数