Je zou, geloof ik, een fabrieksfunctie kunnen maken die je model zou retourneren met een dynamische 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 maakt geen nieuwe instantie van de _meta
van de klasse attribuut elke keer dat deze functie wordt aangeroepen. Een nieuwe instantie maken voor _meta
het is afhankelijk van de naam van de klasse (Django moet het ergens in de cache plaatsen). Een metaklasse kan worden gebruikt om de naam van de klasse tijdens runtime te wijzigen:
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
niet zeker of het dynamisch kan worden ingesteld op een reeds gedefinieerde klasse. Ik heb dit zelf niet gedaan, maar het zou kunnen werken.
Je kunt dit altijd instellen.
>>> MyModel._meta.db_table = '10293847_table'
>>> MyModel.objects.all()