„Wenn ein Arbeiter seine Arbeit gut machen will, muss er zuerst seine Werkzeuge schärfen.“ – Konfuzius, „Die Gespräche des Konfuzius. Lu Linggong“
Titelseite > Programmierung > Wie können Django-Modelle dynamisch für mehrere Tabellen mit gemeinsamen Schemata und dynamischen Namen erstellt werden?

Wie können Django-Modelle dynamisch für mehrere Tabellen mit gemeinsamen Schemata und dynamischen Namen erstellt werden?

Veröffentlicht am 04.11.2024
Durchsuche:834

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

Dynamische Modellerstellung für mehrere Tabellen in Django

Für eine Datenbank mit zahlreichen temporären Tabellen mit gemeinsamen Schemata und dynamischen Namen stellt die Integration von Django Herausforderungen dar . Es ist jedoch möglich, eine Factory-Funktion zum Erstellen von Modellen mit dynamischen Datenbanktabellen zu verwenden.

Dynamische Datenbanktabellenverwaltung

Die Factory-Funktion gibt ein Modell mit einer angegebenen Datenbank zurück Tisch. Dies ermöglicht eine dynamische Datenbindung basierend auf Tabellennamen:

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

Sie können dann das Modell mit dem spezifischen Tabellennamen instanziieren:

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

Metaklasse für dynamische Klassenbenennung

Da Django das _meta-Attribut der Klasse zwischenspeichert, ist eine Metaklasse erforderlich, um den Klassennamen zu ändern zur Laufzeit:

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

Zusätzliche Überlegungen

Obwohl die Datenbanktabelle ursprünglich als unveränderlich galt, kann sie dynamisch festgelegt werden:

MyModel._meta.db_table = '10293847_table'
Neuestes Tutorial Mehr>

Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.

Copyright© 2022 湘ICP备2022001581号-3