Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Einzelnes Django-Modell, mehrere Tabellen?

Sie könnten, glaube ich, eine Factory-Funktion erstellen, die Ihr Modell mit einem dynamischen db_table .

def getModel(db_table):
  class MyClass(models.Model):
     # define as usual ...
     class Meta:
       db_table = db_table

  return MyClass

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

BEARBEITEN:Django erstellt keine neue Instanz von _meta der Klasse -Attribut jedes Mal, wenn diese Funktion aufgerufen wird. Erstellen einer neuen Instanz für _meta es hängt vom Namen der Klasse ab (Django muss es irgendwo zwischenspeichern). Eine Metaklasse kann verwendet werden, um den Namen der Klasse zur Laufzeit zu ändern:

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

nicht sicher, ob es dynamisch auf eine bereits definierte Klasse gesetzt werden kann. Ich habe das noch nicht selbst gemacht, aber es könnte funktionieren.

Sie können dies jederzeit festlegen.

>>> MyModel._meta.db_table = '10293847_table'
>>> MyModel.objects.all()