Можно ли реализовать модель «expando» в Django, как в Google App Engine? Я нашел приложение django с именем django-expando на github, но оно все еще находится на ранней стадии.
Модель Expando в Django
Ответы (1)
Это возможно, но это будет кладж эпических масштабов. GAE использует другой дизайн базы данных, известный как база данных на основе столбцов, а Django ORM предназначен для связи с реляционными базами данных. Поскольку технически все в GAE хранится в одной действительно большой таблице без схемы (поэтому вам не нужно syncdb
для приложений GAE), добавлять произвольные поля несложно. В реляционных базах данных, где каждая таблица хранит только один тип данных (как правило) и имеет фиксированную схему, произвольные поля не так просты.
Одним из возможных способов реализации этого является создание новой модели или таблицы для свойств Expando, в которой хранятся имя таблицы, идентификатор объекта и TextField для маринованных данных, а затем все модели Expando наследуются от подкласс, который переопределяет методы __setattr__
и __getattr__
, автоматически создающие новую строку в этой таблице. Тем не менее, есть несколько серьезных проблем с этим:
- Во-первых, это дешевый хак, который противоречит принципам реляционных баз данных.
- Во-вторых, невозможно запросить эти поля расширения без еще большего количества хаков, и даже в этом случае это было бы смехотворно медленным.
Я рекомендую найти способ спроектировать структуру вашей базы данных, чтобы вам не нужны модели расширения.