Есть страница сайта школы.
При создании был не верно выбран тип связи многие к одному
.
И теперь у ученика есть только один учитель и чтобы добавить к нему второго, требуется
заново добавлять ученика в базу.
Необходимо поменять модели и сделать отношение многие ко многим
между Учителями и Учащимися.
Это решит проблемы текущей архитектуры.
Задача:
- Поменять отношения моделей
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