Проблема с созданием модели с полем «многие ко многим» в сериализаторе - PullRequest
1 голос
/ 27 февраля 2020

У меня есть Course, TeacherProfile и StudentProfile модели со следующими отношениями:

class Course(models.Model):
    students = models.ManyToManyField(
        StudentProfile,
        blank=True,
        related_name='students'
    )
    teachers = models.ManyToManyField(
        TeacherProfile,
        blank=True,
        related_name='teachers'
    )
    name = models.CharField(max_length=30, blank=False)


class TeacherProfile(models.Model):
    user = models.OneToOneField('CoursesUser', on_delete=models.CASCADE)


class StudentProfile(models.Model):
    user = models.OneToOneField('CoursesUser', on_delete=models.CASCADE)

Когда я пытаюсь создать новый курс с помощью запроса POST с телом:

{
  "name": "Course",
  "students": [],
  "teachers": []
}

Я хочу добавить request.user к учителям. Это мое мнение для Course

class CourseList(generics.ListAPIView):
    queryset = Course.objects.all()
    serializer_class = CourseSerializer

    def post(self, request, format=None):
        serializer = CourseSerializer(data=request.data)
        if serializer.is_valid():
            serializer.save(creator=request.user)
            return Response(serializer.data, status=status.HTTP_201_CREATED)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

И сериализатор для Course модели:

class CourseSerializer(serializers.ModelSerializer):
    class Meta:
        model = Course
        fields = ['id', 'name', 'students', 'teachers']

    def create(self, validated_data):
        creator_profile_id = TeacherProfile.objects.filter(
            user__id=validated_data['creator'].id
        )[0].id
        validated_data['teachers'].append(creator_profile_id)

        return Course(**validated_data)

Но есть

Прямое назначение передней стороне множества «многие ко многим» запрещено. Вместо этого используйте student.set ().

Я не понимаю, как использовать `` `set ()` `в моем случае

1 Ответ

0 голосов
/ 27 февраля 2020

Правильный подход - сохранить новую модель, а затем добавить поля ManyToMany. В CourseSerializer.create():

def create(self, validated_data):
    creator_profile_id = TeacherProfile.objects.filter(
            user__id=validated_data['creator'].id
        )[0].id
    name = validated_data['name']
    course = Course(name=name)
    course.save()
    course.teachers.add(creator_profile_id)

    return course
...