Mysql
 sql >> Database >  >> RDS >> Mysql

Singolo modello Django, più tavoli?

Potresti, credo, creare una funzione di fabbrica che restituisca il tuo modello con un 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( ...

EDIT:Django non crea una nuova istanza di _meta della classe attributo ogni volta che questa funzione viene chiamata. Creazione di una nuova istanza per _meta dipende dal nome della classe (Django deve memorizzarlo nella cache da qualche parte). Una metaclasse può essere utilizzata per modificare il nome della classe in fase di esecuzione:

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

non sono sicuro che possa essere impostato dinamicamente su una classe già definita. Non l'ho fatto da solo, ma potrebbe funzionare.

Puoi impostarlo in qualsiasi momento.

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