Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Modelo único do Django, várias tabelas?


Você poderia, acredito, fazer uma função de fábrica que retornaria seu modelo com um 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 não cria uma nova instância do _meta da classe atributo cada vez que esta função é chamada. Criando uma nova instância para _meta ele depende do nome da classe (o Django deve armazená-lo em algum lugar). Uma metaclasse pode ser usada para alterar o nome da classe em tempo de execução:
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

não tenho certeza se pode ser definido dinamicamente em uma classe já definida. Eu não fiz isso sozinho, mas pode funcionar.

Você pode definir isso sempre.
>>> MyModel._meta.db_table = '10293847_table'
>>> MyModel.objects.all()