Mysql
 sql >> Base de données >  >> RDS >> Mysql

Un seul modèle Django, plusieurs tables ?

Vous pourriez, je crois, créer une fonction d'usine qui renverrait votre modèle avec 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 ne crée pas de nouvelle instance du _meta de la classe attribut chaque fois que cette fonction est appelée. Création d'une nouvelle instance pour _meta il dépend du nom de la classe (Django doit le mettre en cache quelque part). Une métaclasse peut être utilisée pour changer le nom de la classe à l'exécution :

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

pas sûr qu'il puisse être défini dynamiquement sur une classe déjà définie. Je ne l'ai pas fait moi-même mais ça pourrait marcher.

Vous pouvez le définir à tout moment.

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