2015-03-17 2 views
1

Я новичок в Django (но опытный разработчик), и я начинаю строить свой первый проект Django.Дизайн модели Django - Как обрабатывать несколько необязательных атрибутов?

Проект действительно прост: сайт, на котором люди могут участвовать в мероприятиях. Администратор устанавливает спортивное мероприятие, выбирает дату, вид мероприятия (бег, теннис, езду на велосипеде) и т. Д., И пользователи могут присоединиться к нему.

Моя проблема заключается в том, что события могут иметь очень разные данные внутри, в зависимости от его категории. Например, если это групповой теннис в два человека, пользователи должны ввести свое имя и имя его товарища по команде, имя своей команды и т. Д. Если мероприятие является байк-рейсом, он может выбрать, хочет ли он сложный или простой маршрут , и т. д.

Я знаю, что могу создать большую модель со всеми атрибутами для каждого вида событий, но это действительно уродливый дизайн ... Для всех регистраций должна быть общая таблица со ссылкой на событие, основные и общие данные (имя, адрес, телефон, электронная почта и т. д.), но я не знаю, как обрабатывать конкретные данные для каждой категории спорта/событий ... Любая идея о том, как организовать это в моделях Django ? Может быть, добавьте простую таблицу (key, inscription_id, type, value)? И тогда, как я могу отобразить форму?

ответ

2

Я считаю, что вы предложили называется Entity-attribute-value моделируют

http://en.wikipedia.org/wiki/Entity%E2%80%93attribute%E2%80%93value_model

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

Для этого вы можете использовать одну из полиморфных библиотек django. Я использовал django-model-utils' InheritanceManager в производстве. Существует довольно много библиотек, включая django-polymorphic.

В основе подхода, основанного на наследовании, можно указать одну модель Event или модель Sport. У спорта может быть название, лига и т. Д. Все Event s могут иметь дату начала и дату окончания и спорт.

Используя этот подход, вы можете определить ключи foriegn от ваших регистраций к базовому классу Event и использовать djangos, встроенный в ORM, для выбора всех событий или регистрации определенных типов, без дополнительной проверки/проверки объекта подход EAV!

+0

Да, это именно то, что я ищу! Поскольку я полный новичок Django, я не знал, что возможно иметь наследование модели (например, в Hibernate, насколько я помню). Очень хороший ответ! :) – mHouses

0

Вы можете сохранить все дополнительные данные в текстовом поле, используя объект JSON или другой сериализатор.

Возьмите взгляд на django-jsonfield

+2

Как вы запрашиваете данные в jsonfield? – dm03514

+0

Это возможно только с помощью регулярного выражения или встроенного в функциональность базы данных для анализа json (если есть). Но если вам не нужно запрашивать эти данные, просто отобразите его, вы можете его использовать. – GwynBleidD

+0

Как отмечает dm03514, добавление всех данных в поле JSON ограничивает возможности базы данных, например, поиск всех зарегистрированных пользователей, которые хотят играть в теннис в поле травы (например) ... В любом случае, спасибо за ваш ответ ! :) – mHouses

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