Django Rest вложенные сериализаторы множественные модели CRUD операций с использованием миксинов

Я пытаюсь реализовать операцию CRUD с вложенным сериализатором с несколькими моделями данных, чтобы я мог записывать все поля сразу при вызове конечной точки API.

Нужно ли мне использовать какую-то фильтрацию или цикл for? Я не нашел похожего поста, в котором используется mixins. Django-Rest вложенная сериализация OneToOne

Django rest framework- writable(create,update) double nested serializer

models.py

class Student(models.Model):
    student_id = models.UUIDField(default=uuid.uuid4, unique=True,
                      primary_key=True, editable=False)
    firstName = models.CharField(max_length=20)
    age = models.IntegerField(default=18)

   

class Course(models.Model):
    student_id = models.ForeignKey(Student, on_delete=models.CASCADE)
    courseName = models.CharField(max_length=20)
    courseYear = models.IntegerField(default=2021)
    student = models.ManyToManyField(Student, related_name='courses')


class Homework(models.Model):
    student_id = models.ForeignKey(Student, on_delete=models.CASCADE)

    hwName = models.CharField(max_length=20)
    hwPossScore = models.IntegerField(default=100)
    course = models.ForeignKey(Course, related_name='homeworks', on_delete=models.CASCADE, null=True, blank=True)
    students = models.ManyToManyField(Student)

Serializers.py

class StudentSerializer(serializers.ModelSerializer):
  
    class Meta:
        model = Student
        fields = "__all__"


class HomeworkSerializer(serializers.ModelSerializer):
   
    class Meta:
        model = Homework
        fields = __all__


class CourseSerializer(serializers.ModelSerializer):
   
    class Meta:
        model = Course
        fields = "__all__"

class All_Serializer(serializers.ModelSerializer):
    
    students = serializers.SerializerMethodField()
    homeworks = serializers.SerializerMethodField()
    courses = serializers.SerializerMethodField()
    
    def get_students(self, obj):
        students = obj.student_set.all()
        serializer = StudentSerializer(students, many=True)
        return serializer.data

    def get_homeworks(self, obj):
        homeworks = obj.homework_set.all()
        serializer = HomeworkSerializer(homeworks, many=True, read_only=True)  
        return serializer.data

    def get_coruses(self, obj):
        courses = obj.courses_set.all()
        serializer = CourseSerializer(courses, many=True, read_only=True)  
        return serializer.data

    class Meta:
        model = Student
        fields = ('student_id','firstName','age','homeworks','courses')
   

views.py

 class Main_mixins(generics.GenericAPIView, 
                                mixins.ListModelMixin, 
                                mixins.CreateModelMixin,
                                mixins.RetrieveModelMixin,
                                mixins.UpdateModelMixin,
                                mixins.DestroyModelMixin):
    serializer_class = All_Serializer
    queryset = Student.objects.all()
    lookup_field = 'student_id'

    def get(self, request, student_id=None):
        if student_id:
           return self.retrieve(request, student_id)
        else:
            return self.list(request)
    
    def post(self, request):
        return self.create(request)
    
    def perform_create(self, serializer):
        serializer.save()
    
    
    def put(self, request, student_id=None):
        return self.update(request, student_id=None, homeworks, courses)

В пользовательском интерфейсе django rest api я вижу только student_id. Других полей там нет.

Вернуться на верх