Как вы публикуете данные в django с атрибутом depth=1 в сериализаторе?

У меня есть модель django под названием "Enrolment", которая зависит от двух других моделей через внешний ключ. Модель "Course" и модель "Enrolment". Модель "Курс" выглядит следующим образом:

class Course(models.Model):
    
    name = models.CharField(max_length=100, blank=True)
    description = models.TextField(blank=True)
    prerequisite = models.TextField(blank=True)
    fee = models.FloatField(default=0.0)

    def __str__(self):
        return self.name

А модель зачисления выглядит следующим образом:

class CourseEnrolment(models.Model):
    
    course_name = models.ForeignKey(
        Course, on_delete=DO_NOTHING)
    schedule = models.CharField(max_length=50, blank=True)
    student = models.ForeignKey(
        UserAccount, on_delete=DO_NOTHING)
    enrolment_date = models.DateTimeField(default=datetime.now())

    def __str__(self):
        return self.course_name.name

Чтобы получить доступ к информации о зачисленном курсе, я должен сделать следующее в CourseEnrolmentSerializer:

class CourseEnrolmentSerializer(serializers.ModelSerializer):
    class Meta:
        model = CourseEnrolment
        depth = 1
        fields = '__all__'

При этом "depth = 1" является секретом доступа к информации о курсе. Теперь, когда я получаю информацию о зачислении, я получаю ответ, как показано ниже, что является именно тем, что я хочу, например, так.

 {
        "id": 5
        "schedule": "June 23, 2022",
        "course_name": {
            "id": 4,
            "name": "fundamentals-of-programming",
            "description": "some description .",
            "prerequisite": "some prerequisite",
            "fee": 1000,
     },
        "student": {
            "id": 1,
            "email": "martinsakinbo@yahoo.com",
            "first_name": "John",
            "last_name": "Doe",
            "phone": "1111111",
        }
    },

Теперь, у меня проблема в том, что с "depth=1" в сериализаторе, я не могу создать зачисление, когда я пишу следующее представление

class CourseEnrolment(generics.CreateAPIView):
    queryset = CourseEnrolment.objects.all()
    serializer_class = CourseEnrolmentSerializer

Пытаюсь создать регистрацию в postman, выполняя следующие действия:

{
        "course_name": 3,
        "schedule": "June 23, 2022",
        "student": 1
}

Выдает ошибку "null value in column "course_name_id" of relation "course_courseenrolment" violates not-null constraint". Я также пробовал вложенность в id имени_курса и id студента, делая так:

{
        "course_name.id": 3,
        "schedule": "June 23, 2022",
        "student.id": 1
}

Я получаю ту же ошибку. Но если я удалю depth=1 из сериализатора, все работает, и я собираюсь создать зачисление. ПОЖАЛУЙСТА, КАК СОЗДАТЬ (ПОСТ) ЗАЧИСЛЕНИЕ, сохранив "глубину=1"? ИЛИ ЕСТЬ ЛУЧШИЙ ИЛИ ДРУГОЙ СПОСОБ, КОТОРЫМ Я ДОЛЖЕН НАПИСАТЬ МОЕ ПРЕДСТАВЛЕНИЕ. ЕСЛИ ДА, ТО КАК?

Сделайте новый сериализатор для создания курса:

class CreateCourseEnrollmentSerializer(serializers.ModelSerializer):
    class Meta:
       model = CourseEnrolment
       fields = "__all__"

И внутри представления определите метод get_serializer_class() следующим образом (который вы можете использовать, если ваше представление поддерживает более одного HTTP действия):

from .serializers import CreateCourseEnrollmentSerializer, CourseEnrolmentSerializer

class CourseEnrollmentView(generics.CreateAPIView):
    # ...
    def get_serializer_class(self):
        if self.action == "create":
            return CreateCourseEnrollmentSerializer
        return CourseEnrolmentSerializer
Вернуться на верх