Целью домашнего задания является проектирование модели базы данных, наполнение ее тестовыми данными и и отображение этих данных на сайте. Таким образом будет создана read-only версия сайта.
Используя Django Models спроектировать схему вашего приложения. Создать модели для основных сущностей: вопрос, ответ, тег, профиль пользователя, лайк. Важно использовать правильные типы данных и проставить необходимые связи (ForeignKey) в моделях. Для вопросов создать свой Model Manager, в котором определить типичные выборки (“лучшие” и “новые” вопросы).
Поскольку мы будем использовать встроенную авторизацию Django (django.contrib.auth) - у нас будет готовая модель пользователя (django.contrib.auth.models.User), но необходимо создать дополнительную модель (Profile) в которую разместить дополнительные поля, например avatar. Модель Profile и User должны быть связаны один к одному.
Модели лайков вопросов (QuestionLike) и лайков ответов (AnswerLike) должны явно описаны в models.py. В этих моделях должны быть заложены ограничения по накрутке лайков - один пользователь одной и той же сущности не может поставить два лайка, в этом случае нужно ограничение на уровне базы unique_together.
В коде view не должно быть кода бизнес логики (анти-паттерн fat controller). Все методы по выборке и сортировке данных - в ModelManager. Вся логика по выводу данных, например построение полного пути к вопросу - в методы модели. Пагинация - в отдельную функцию. Вьюшки должны состоять из 4-6 строк.
Для удобства дальнейшей разработки нужно наполнить базу тестовыми данными. Для этого нужно создать скрипт (а лучше это сделать в виде команды приложения - Management Command), в котором добавить необходимые объекты в базу. При добавлении удобно использовать уже созданные модели, а не писать сырой SQL.
Обратите внимание, что при указании связи в моделях можно использовать как id, так и объекты на которые вы ссылаетесь:
u = User.objects.get(pk=1)
q = Question(author=u, text='wut?') # ссылка на объект
q.save()
a = Answer(question_id=1, text='blabla') # ссылка по id
a.save()
В базе данных в любом случае будут хранится поля вида author_id и question_id.
Требования к объему данных:
- Пользователи > 10 000.
- Вопросы > 100 000.
- Ответы > 1 000 000.
- Тэги > 10 000.
- Оценки пользователей > 2 000 000.
Внимание! Management command должна быть вида:
python manage.py fill_db [ratio]
Где num_users — коэффициент заполнения сущностей. Соответственно, после применения команды в базу должно быть добавлено:
- пользователей — равное ratio;
- вопросов — ratio * 10;
- ответы — ratio * 100;
- тэгов - ratio;
- оценок пользователей - ratio * 200;
Разработать view для отображения следующих страниц:
- Список новых вопросов;
- Список “лучших” вопросов;
- Список вопросов по тегу;
- Страница 1 вопроса со списком ответов.
Для страниц не существующих объектов нужно возвращать 404 страницу. В коде view (контроллеров) не должно быть дублирующегося кода. Использовать функцию пагинации созданную на предыдущем занятии.
В качестве СУБД по умолчанию в Django используется SQLite. Это встраиваемая СУБД, которая представляет собой файл в каталоге с вашим Django-проектом. Такое решение удобно для отладки, но не может использоваться "в продакшене".
Требуется отказаться от стандартной СУБД SQLite в пользу иной реляционной СУБД на ваш выбор: MySQL или PostgreSQL. Для этого необходимо развернуть локально инстанс СУБД на вашей машине и внести небольшие изменения в конфигурацию проекта Django. См. документацию по ссылкам ниже.
Проектирование модели - 5:
- правильные адекватные типы данных и внешние ключи - 1;
- своя модель пользователя - 1;
- таблицы тегов, лайков - 1;
- query-set'ы для типовых выборок: новые вопросы, популярные, по тегу - 2.
Наполнение базы тестовыми данными - 3:
- скрипт для наполнения данными - 1;
- использование django management commands - 1;
- соблюдение требований по объему данных - 1.
Отображение списка вопросов - 3:
- список новых вопросов - 1;
- список популярных - 1;
- список вопросов по тегу - 1.
Отображение страницы вопроса - 3:
- общее - 3.
Использование СУДБ - 2:
- MySQL или PostgreSQL - 2.
- Туториал по проектированию моделей в Django;
- Подробная документация по моделям;
- Скрипты - Management Commands.
- Подключение MySQL к Django - Databases - MySQL
- Как поднять MySQL на своей машине с помощью Docker - Basic Steps for MySQL Server Deployment with Docker
- Как настроить MySQL и Djagno приложение - How To Create a Django App and Connect it to a Database