"Se um trabalhador quiser fazer bem o seu trabalho, ele deve primeiro afiar suas ferramentas." - Confúcio, "Os Analectos de Confúcio. Lu Linggong"
Primeira página > Programação > Como os modelos Django podem ser criados dinamicamente para múltiplas tabelas com esquemas compartilhados e nomes dinâmicos?

Como os modelos Django podem ser criados dinamicamente para múltiplas tabelas com esquemas compartilhados e nomes dinâmicos?

Publicado em 2024-11-04
Navegar:761

How can Django models be dynamically created for multiple tables with shared schemas and dynamic names?

Criação de modelo dinâmico para múltiplas tabelas no Django

Para um banco de dados contendo inúmeras tabelas temporárias com esquemas compartilhados e nomes dinâmicos, a integração do Django apresenta desafios . No entanto, é possível usar uma função de fábrica para criar modelos com tabelas de banco de dados dinâmicas.

Gerenciamento de tabela de banco de dados dinâmico

A função de fábrica retorna um modelo com um banco de dados especificado mesa. Isso permite a vinculação dinâmica de dados com base em nomes de tabelas:

def getModel(db_table):
  class MyClass(models.Model):
    # Model definition goes here...
    class Meta:
      db_table = db_table
  return MyClass

Você pode então instanciar o modelo com o nome da tabela específica:

newClass = getModel('29345794_table')
newClass.objects.filter(...)

Metaclasse para nomeação dinâmica de classes

Como o Django armazena em cache o atributo _meta da classe, uma metaclasse é necessária para modificar o nome da classe em tempo de execução:

def getModel(db_table):
  class MyClassMetaclass(models.base.ModelBase):
    def __new__(cls, name, bases, attrs):
      name  = db_table
      return models.base.ModelBase.__new__(cls, name, bases, attrs)

  class MyClass(models.Model):
    __metaclass__ = MyClassMetaclass
    class Meta:
      db_table = db_table
  return MyClass

Considerações Adicionais

Embora inicialmente considerada imutável, a tabela do banco de dados pode ser definida dinamicamente:

MyModel._meta.db_table = '10293847_table'
Tutorial mais recente Mais>

Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.

Copyright© 2022 湘ICP备2022001581号-3