Модель Expando в Django

Можно ли реализовать модель «expando» в Django, как в Google App Engine? Я нашел приложение django с именем django-expando на github, но оно все еще находится на ранней стадии.


person koko    schedule 02.02.2010    source источник


Ответы (1)


Это возможно, но это будет кладж эпических масштабов. GAE использует другой дизайн базы данных, известный как база данных на основе столбцов, а Django ORM предназначен для связи с реляционными базами данных. Поскольку технически все в GAE хранится в одной действительно большой таблице без схемы (поэтому вам не нужно syncdb для приложений GAE), добавлять произвольные поля несложно. В реляционных базах данных, где каждая таблица хранит только один тип данных (как правило) и имеет фиксированную схему, произвольные поля не так просты.

Одним из возможных способов реализации этого является создание новой модели или таблицы для свойств Expando, в которой хранятся имя таблицы, идентификатор объекта и TextField для маринованных данных, а затем все модели Expando наследуются от подкласс, который переопределяет методы __setattr__ и __getattr__, автоматически создающие новую строку в этой таблице. Тем не менее, есть несколько серьезных проблем с этим:

  • Во-первых, это дешевый хак, который противоречит принципам реляционных баз данных.
  • Во-вторых, невозможно запросить эти поля расширения без еще большего количества хаков, и даже в этом случае это было бы смехотворно медленным.

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

person LeafStorm    schedule 02.02.2010
comment
спасибо :) Я просто изучаю модель расширения. Я думаю, что патч движка приложения или appengine-helper идеально подходят для меня. - person koko; 03.02.2010