"Si un trabajador quiere hacer bien su trabajo, primero debe afilar sus herramientas." - Confucio, "Las Analectas de Confucio. Lu Linggong"
Página delantera > Programación > ¿Cómo se pueden crear dinámicamente modelos de Django para múltiples tablas con esquemas compartidos y nombres dinámicos?

¿Cómo se pueden crear dinámicamente modelos de Django para múltiples tablas con esquemas compartidos y nombres dinámicos?

Publicado el 2024-11-04
Navegar:328

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

Creación de modelo dinámico para múltiples tablas en Django

Para una base de datos que contiene numerosas tablas temporales con esquemas compartidos y nombres dinámicos, la integración de Django presenta desafíos . Sin embargo, es posible utilizar una función de fábrica para crear modelos con tablas de bases de datos dinámicas.

Gestión de tablas de bases de datos dinámicas

La función de fábrica devuelve un modelo con una base de datos específica mesa. Esto permite el enlace de datos dinámico basado en nombres de tablas:

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

Luego puede crear una instancia del modelo con el nombre de tabla específico:

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

Metaclase para denominación dinámica de clases

Dado que Django almacena en caché el atributo _meta de la clase, es necesaria una metaclase para modificar el nombre de la clase en tiempo de ejecución:

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

Consideraciones adicionales

Aunque inicialmente se pensó que era inmutable, la tabla de la base de datos se puede configurar dinámicamente:

MyModel._meta.db_table = '10293847_table'
Último tutorial Más>

Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.

Copyright© 2022 湘ICP备2022001581号-3