Как вы публикуете данные в 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