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']