Загрузка данных из внешнего JSON‑API в модели курса и уровня

Явно сопоставьте русские поля API с полями моделей, переиспользуйте Level и выберите устойчивый ключ Course. Один код специальности здесь не отличает профили разных лет.

Короткий ответ

Что ответить на собеседовании

Явно сопоставьте русские поля 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__' не переводит названия полей и не создаёт связанные уровни автоматически. Сетевой запрос выполняйте до транзакции, большие импорты — ограниченными партиями.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее