Генерация модели во время выполнения с использованием django - PullRequest
4 голосов
/ 04 октября 2010

У меня есть приложение, которое должно генерировать свои модели во время выполнения.
Это будет сделано в соответствии с текущей схемой базы данных.
Как это можно сделать?
Как создать классы во время выполнения вpython?
Должен ли я создать представление json, сохранить его в базе данных и затем десериализовать его в объект python?

Ответы [ 3 ]

8 голосов
/ 04 октября 2010

Вы можете попробовать это прочитать http://code.djangoproject.com/wiki/DynamicModels

Вот пример того, как создать класс модели Python:

Person = type('Person', (models.Model,), {
    'first_name': models.CharField(max_length=255),
    'last_name': models.CharField(max_length=255),
})

Вы также можете прочитать о мета-классах python:
- Что такое метакласс в Python?
- http://www.ibm.com/developerworks/linux/library/l-pymeta.html
- http://gnosis.cx/publish/programming/metaclass_1.html

2 голосов
/ 04 октября 2010

Вы можете опираться на устаревшую поддержку базы данных django, которая позволяет получать модели django из определений, найденных в базе данных:

Смотрите здесь: http://docs.djangoproject.com/en/dev/howto/legacy-databases/?from=olddocs

В частности,

manage.py inspectdb 

позволяет создавать классы в файле. После этого вы сможете импортировать их на лету.

Тем не менее, мне кажется, что вы делаете рискованный путь, делая это.

1 голос
/ 04 октября 2010

У меня есть приложение, которое должно генерировать свои модели во время выполнения.

Посмотрите исходный код для команды управления inspectdb. Inspectdb "Анализирует таблицы базы данных в базе данных, на которую указывает параметр NAME, и выводит модуль модели Django (файл models.py) в стандартный вывод."

Как я могу создавать классы во время выполнения в python?

Один из способов сделать это - использовать функции, предоставляемые модулем new (этот модуль устарел в пользу types с версии 2.6).

Должен ли я создать представление json, сохранить его в базе данных и затем десериализовать его в объект python?

Это не похоже на хорошую идею для меня.

PS: Все говорили, что вы должны действительно переосмыслить предпосылки для создания классов во время выполнения. Это выглядит довольно экстремально для веб-приложения. Просто мой 2с.

...