Django POST запрос: Я всегда получаю ошибку 400, и данные, предоставленные в запросе, не принимаются.

У меня есть проект django со следующими (относящимися к данному вопросу) приложениями: Course, Category, User (Teacher) & SubCategory.

Используя Django REST Framework, я пытаюсь переопределить метод perform_create(), чтобы определенные поля модели курса уже были заняты при создании нового экземпляра. Я бы хотел, чтобы поле "teacher" было текущим пользователем, поле "category" было экземпляром категории, которому соответствуют данные запроса "category", и т.д.

Теперь всякий раз, когда я выполняю код, я получаю ошибку 400, и он говорит, что "Это поле требуется" для учителя, категории, подкатегории и т.д.

Найдите код ниже:

Модель курса

class Course(models.Model):
    name = models.CharField(max_length=100)
    description = models.TextField(max_length=500)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)
    premium_only = models.BooleanField(default=False)
    duration = models.IntegerField(default=0)
    level = models.CharField(max_length=100)

    # Relationships
    category = models.ForeignKey(
        to=Category, related_name='courses', on_delete=models.CASCADE)
    sub_category = models.ForeignKey(
        to=SubCategory, related_name='courses', on_delete=models.CASCADE)
    teacher = models.ForeignKey(
        to=User, related_name='courses', on_delete=models.CASCADE)
    marked_as_favorite_by = models.ManyToManyField(
        to=User, related_name='favorite_courses', blank=True, null=True, default=None)

    def __str__(self):
        return self.name

Просмотры курсов

class CreateCourseView(CreateAPIView):
queryset = Course.objects.all()
serializer_class = CourseSerializer
permission_classes = [IsAuthenticated]

def perform_create(self, serializer):
    categories = Category.objects.all()
    sub_categories = SubCategory.objects.all()
    teacher = self.request.user
    category = categories.get(name=self.request.data['category'])
    sub_category = sub_categories.get(
        name=self.request.data['sub_category'])
    serializer.save(teacher=teacher, category=category,
                    sub_category=sub_category)

Достаточно ли этой информации для того, чтобы вы смогли мне помочь?

Заранее спасибо!

Исходя из этого ответа вам нужно опустить 'category', 'sub_category', 'teacher', 'marked_as_favorite_by' из списка мета-полей CourseSerialiser, поскольку вы не хотите создавать новые объекты, а просто используете существующие, которые передаются в вашей функции perform_create.

Мне следовало использовать "read_only = True" в сериализаторе. Это сработало!

class CourseSerializer(serializers.ModelSerializer):
category = CourseCategorySerializer(read_only=True)
sub_category = CourseSubCategorySerializer(read_only=True)
teacher = CourseTeacherSerializer(read_only=True)
marked_as_favorite_by = CourseTeacherSerializer(read_only=True, many=True)

class Meta:
    model = Course
    fields = ['id', 'name', 'description', 'created_at',
              'updated_at', 'premium_only', 'duration', 'level', 'teacher', 'marked_as_favorite_by', 'category', 'sub_category']
    read_only_fields = ['teacher', 'marked_as_favorite_by', 'category', 'sub_category']
Вернуться на верх