2012-01-29 4 views
5

Можно создать дубликат:
Django dynamic model fieldsОпределенные пользователем поля Django, как?

Good Morning ребята! Сценарий следующий. Для некоторых моделей на Django я хотел бы позволить конечному пользователю определить его собственные поля. Было бы здорово, если бы я смог сохранить все потрясающие функции Django, такие как ORM, поэтому я все еще могу делать вызовы типа field__gte для поиска по модели, по-прежнему есть проверка поля в соответствии с типом поля и т. Д. Я подумал о двух способах выполнения это, и я более чем открыт для новых предложений. Любая обратная связь будет ОЧЕНЬ оценена.

  1. Первый подход, является сущность-атрибут-значение (http://en.wikipedia.org/wiki/Entity%E2%80%93attribute%E2%80%93value_model), который DJANGO уже есть приложение для. См. http://code.google.com/p/django-custom-field/ Я думаю, что это будет ОК, но я теряю способность делать «mymodel.objects.filter (custom_field_x = something)». Может быть, есть способ вернуть ORM, любые идеи? Но я слышал так много плохих историй об этом методе, что я немного боюсь его использовать.

  2. Второй подход - иметь таблицу базы данных для каждого из пользователей (возможно, не более 1000). Я читал, что django имеет что-то в строках inspectdb, которое фактически проверяет, какие поля есть, и производит модель для вас. Это может быть полезно, но я думаю, может быть, я должен сохранить поля, созданные этим конкретным пользователем, и каким-то образом динамически рассказать django, эй, у нас также есть эти поля в этой модели. Это возможно? Я знаю, что обычно плохо иметь разные таблицы для каждого пользователя, но, учитывая этот сценарий, как бы вы, ребята, оценили этот метод, было бы хорошо иметь одну таблицу для каждого пользователя?

Модель, которая требует пользовательских полей, например, Person. Им может понадобиться настраиваемое поле для хранения адреса, типа крови или любой другой вещи.

МНОГО СПАСИБО заранее! Хорошего воскресенья!

Очень похоже: How to create user defined fields in Django - но только говорит о EAV, которого я бы хотел избежать. Я открыт для новых идей!

+1

Найдено лучше ссылки никогда: http://stackoverflow.com/questions/7933596/django-dynamic-model-fields К сожалению, мой вопрос является дубликатом, что один , Моды, не стесняйтесь закрыть его. – Clash

ответ

1

Один из подходов заключается в использовании решения на основе документов NoSQL, такого как MongoDB, которое позволяет хранить объекты, имеющие структуру флюида (без таких ограничений, как предопределенные столбцы).

Плюсы:

  1. Нет ограничений на типы настраиваемых полей, число типов полей и т.д.
  2. Сохраняет функциональность ОРМ (django-mongodb)
  3. Другие различные преимущества NoSQL - которые вы можете прочитать онлайн
  4. избегает EAV

Минусы:

  1. Необходимо установить сервер NoSQL
  2. Дополнительные знания, необходимые для концепций NoSQL (документы противтаблицы)
  3. Вы, возможно, придется поддерживать две базы данных - если вы решили не переносить всю решение NoSQL (multi-db)

EDIT:

После прочтения комментариев его стоит отметить, что в зависимости от с решением NoSQL, с которым вы работаете, вам может не понадобиться поддержка реверсии. CouchDB, например, имеет встроенную поддержку для document versioning.

+0

Привет, burhan, спасибо за ваш ответ! mongodb выглядит великолепно. К сожалению, мой общий хостинг не поддерживает его. Теперь я ищу новый веб-хостинг (но это другое дело). В любом случае, я хотел спросить: знаете ли вы, что использование mongodb перерывает любые другие приложения? Например, если я использую django-revisions (http://djangopackages.com/packages/p/django-revisions/), будет ли он работать? Спасибо заранее! – Clash

+1

@ Clash, да, использование mongodb нарушит внешние django-приложения, которые не ожидают использования базы данных NoSQL. Поэтому django-ревизии не будут работать. Однако вы можете настроить несколько баз данных, поскольку Django теперь поддерживает это. Единственная проблема с этим - неспособность присоединиться к этим базам данных. – Spike

+0

@Spike, я вижу. Я бы не смог использовать ревизии на моделях, которые используют пользовательские поля, я думаю? Большое спасибо за ответ! – Clash

1

как создать другую модель для хранения user_defined_fields?

class UserDefinedField(models.Model): 
     #.................. 
     user = models.ForeignKey(User) 
     field_name = models.CharField(max_length=50) 
     field_value = models.TextField() 

Затем вы можете сделать UserDefinedField.objects.filter(field_name=some_name,field_value=somevalue)

+1

Я думаю, это всего лишь небольшая вариация EAV – Clash

Смежные вопросы