«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Как можно динамически создавать модели Django для нескольких таблиц с общими схемами и динамическими именами?

Как можно динамически создавать модели Django для нескольких таблиц с общими схемами и динамическими именами?

Опубликовано 4 ноября 2024 г.
Просматривать:283

How can Django models be dynamically created for multiple tables with shared schemas and dynamic names?

Создание динамической модели для нескольких таблиц в Django

Для базы данных, содержащей множество временных таблиц с общими схемами и динамическими именами, интеграция Django представляет проблемы . Однако можно использовать фабричную функцию для создания моделей с динамическими таблицами базы данных.

Динамическое управление таблицами базы данных

Фабрика возвращает модель с указанной базой данных стол. Это позволяет осуществлять динамическую привязку данных на основе имен таблиц:

def getModel(db_table):
  class MyClass(models.Model):
    # Model definition goes here...
    class Meta:
      db_table = db_table
  return MyClass

Затем вы можете создать экземпляр модели с конкретным именем таблицы:

newClass = getModel('29345794_table')
newClass.objects.filter(...)

Метакласс для динамического именования классов

Поскольку Django кэширует атрибут _meta класса, для изменения имени класса необходим метакласс во время выполнения:

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'
Последний учебник Более>

Изучайте китайский

Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.

Copyright© 2022 湘ICP备2022001581号-3