Uważam, że możesz stworzyć funkcję fabryczną, która zwróci model z dynamicznym 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( ...
EDYCJA:Django nie tworzy nowej instancji _meta
klasy atrybut przy każdym wywołaniu tej funkcji. Tworzenie nowej instancji dla _meta
zależy to od nazwy klasy (Django musi ją gdzieś zapisać w pamięci podręcznej). Metaklasa może służyć do zmiany nazwy klasy w czasie wykonywania:
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
nie jestem pewien, czy można go ustawić dynamicznie na już zdefiniowanej klasie. Sam tego nie robiłem, ale to może zadziałać.
Możesz to ustawić w dowolnym momencie.
>>> MyModel._meta.db_table = '10293847_table'
>>> MyModel.objects.all()