У меня есть несколько временных таблиц в базе данных MySQL, которые используют одну и ту же схему и имеют динамические имена. Как использовать Django для взаимодействия с этими таблицами? Может ли одна модель извлекать данные из нескольких таблиц?
Одна модель Django, несколько таблиц?
Ответ 1
Вы можете, я полагаю, создать функцию factory, которая вернет вашу модель с динамическим 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 не создает новый экземпляр класса _meta
при каждом вызове этой функции. Создание нового экземпляра для _meta
зависит от имени класса (Django должен кэшировать его где-то). Метакласс можно использовать для изменения имени класса во время выполнения:
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
не уверен, может ли он быть установлен динамически на уже определенном классе. Я не делал этого сам, но он мог бы работать.
Вы можете установить это каждый раз.
>>> MyModel._meta.db_table = '10293847_table'
>>> MyModel.objects.all()
Ответ 2
Динамически создайте модель для вашей таблицы.
from django.db import models
from django.db.models.base import ModelBase
def create_model(db_table):
class CustomMetaClass(ModelBase):
def __new__(cls, name, bases, attrs):
model = super(CustomMetaClass, cls).__new__(cls, name, bases, attrs)
model._meta.db_table = db_table
return model
class CustomModel(models.Model):
__metaclass__ = CustomMetaClass
# define your fileds here
srno = models.IntegerField(db_column='SRNO', primary_key=True)
return CustomModel
и вы можете начать запрос к базе данных.
In [6]: t = create_model('trial1')
In [7]: t._meta.db_table
Out[7]: 'trial1'
In [8]: t.objects.all() # default db
Out[8]: [<CustomModel: CustomModel object>, '(remaining elements truncated)...']
In [9]: t.objects.using('test').all() # test db
Out[9]: [<CustomModel: CustomModel object>, '(remaining elements truncated)...']