Явно сопоставьте русские поля API с полями моделей, переиспользуйте Level и выберите устойчивый ключ Course. Один код специальности здесь не отличает профили разных лет.
Загрузка данных из внешнего JSON‑API в модели курса и уровня
Явно сопоставьте русские поля API с полями моделей, переиспользуйте Level и выберите устойчивый ключ Course. Один код специальности здесь не отличает профили разных лет.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Необходимо обработать полученный от стороннего API JSON‑массив и записать информацию в модели Course и Level, учитывая их взаимосвязи.
from rest_framework import serializers
from courses.models import Course
class CourseSerializer(serializers.ModelSerializer):
class Meta:
model = Course
fields = '__all__'
[
{
"Код": "01.03.02",
"Специальность": "Прикладная математика и информатика",
"Профиль": "Имитационное моделирование и анализ данных, 2021",
"УровеньПодготовки": "Бакалавриат"
},
{
"Код": "01.03.02",
"Специальность": "Прикладная математика и информатика",
"Профиль": "Имитационное моделирование и анализ данных, 2022",
"УровеньПодготовки": "Бакалавриат"
},
{
"Код": "01.03.02",
"Специальность": "Прикладная математика и информатика",
"Профиль": "Имитационное моделирование и анализ данных, 2023",
"УровеньПодготовки": "Бакалавриат"
}
]
Ответ
Явно сопоставьте русские поля API с полями моделей, переиспользуйте Level и выберите устойчивый ключ Course. Один код специальности здесь не отличает профили разных лет.
Предположим поля Level.name и Course.code, name, profile, level:
from django.db import transaction
@transaction.atomic
def import_courses(rows):
for row in rows:
level, _ = Level.objects.get_or_create(
name=row['УровеньПодготовки'])
Course.objects.update_or_create(
code=row['Код'], profile=row['Профиль'], level=level,
defaults={'name': row['Специальность']})
Это схема для предварительно валидированных данных. Реальные поля моделей нужно сверить, а уникальность выбранного ключа закрепить в БД. Если API предоставляет постоянный внешний ID, предпочтительнее использовать его. fields='__all__' не переводит названия полей и не создаёт связанные уровни автоматически. Сетевой запрос выполняйте до транзакции, большие импорты — ограниченными партиями.