Du kan, tror jag, göra en fabriksfunktion som skulle returnera din modell med en dynamisk 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 skapar inte en ny instans av klassens _meta
attribut varje gång den här funktionen anropas. Skapar en ny instans för _meta
det beror på namnet på klassen (Django måste cache den någonstans). En metaklass kan användas för att ändra namnet på klassen vid körning:
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
inte säker på om den kan ställas in dynamiskt på en redan definierad klass. Jag har inte gjort det här själv men det kanske fungerar.
Du kan ställa in detta när som helst.
>>> MyModel._meta.db_table = '10293847_table'
>>> MyModel.objects.all()