Есть страница сайта школы.
При создании был неверно выбран тип связи многие к одному
.
И теперь у ученика есть только один учитель и чтобы добавить к нему второго, требуется
заново добавлять ученика в базу.
Необходимо поменять модели и сделать отношение многие ко многим
между Учителями и Учащимися.
Это решит проблемы текущей архитектуры.
Задача:
- Поменять отношения моделей
Student
иTeacher
сForeign key
наMany to many
. - Поправить шаблон списка учеников с учётом изменения моделей.
Сначала примените текущую миграцию, затем загрузите исходные данные с помощью loaddata
и после этого меняйте модели и делайте новые миграции.
В противном случае loaddata
не сможет загрузить данные на новую схему и их придётся заносить вручную.
Для смены связи достаточно поменять поле модели с ForeignKey
на ManyToManyField
. Не забудьте поменять и название поля, ведь раньше был один учитель teacher
, а теперь может быть много — teachers
.
К полю ManyToManyField
добавить параметр related_name='students'
, чтобы можно было получить список студентов у одного учителя.
После смены поля необходимо создать новую миграцию и применить её к базе данных.
В шаблоне для отображения всех учителей ученика можно использовать вложенный цикл:
{% for teacher in student.teachers.all %}
<p>{{ teacher.name }}: {{ teacher.subject }}</p>
{% endfor %}
Более подробно примеры как работать с ManyToManyField
можно посмотреть в документации Django.
https://docs.djangoproject.com/en/dev/ref/contrib/admin/#working-with-many-to-many-models
Проанализируйте число SQL-запросов. Напоминание: для этого можно использовать django-debug-toolbar
. Для каждого студента будет выполняться отдельный запрос. Это не очень производительное решение — улучшите его с помощью prefetch_related
(документация).
Для запуска проекта необходимо
pip install -r requirements.txt
python manage.py migrate
Важно: после изменения моделей и применения миграций загрузить данные не получится. Выполните загрузку данных до изменения моделей.
python manage.py loaddata school.json
Если все же изменили модели, но не загрузили тестовые данные, ничего страшного, можно создать тестовые данные самостоятельно в админке.
python manage.py runserver