Использование одного и того же класса сериализатора, но с разными действиями в представлении в Django rest framework

У меня есть представление modelset, в котором на основе требований определены различные функции customs. Мне нужно написать еще одну функцию get, в которой я хочу использовать тот же класс сериализатора. Но поле, которое я определил в классе сериализатора в pkfield, но для функции get я хочу, чтобы оно было строковым полем, а не полем pk. Как этого добиться?

Кроме того, я определил depth=1, что также не работает.

class Class(TimeStampAbstractModel):
    teacher = models.ForeignKey(
                                Teacher,
                                on_delete=models.CASCADE,
                                null=True,
                                related_name="online_class",
    )
    subject = models.ForeignKey(
                                Subject,
                                on_delete=models.SET_NULL,
                                null= True,
                                related_name= "online_class",
    )
    students_in_class = models.ManyToManyField(Student, related_name="online_class")

Мое мнение:

class ClassView(viewsets.ModelViewSet):
    queryset = Class.objects.all()
    serializer_class = ClassSerializer
    serializer_action_classes = {
        'add_remove_students': AddStudentstoClassSerializer,
        'get_all_students_of_a_class': AddStudentstoClassSerializer,
    }

    def get_serializer_class(self):

        """
            returns a serializer class based on the action
            that has been defined.
        """
        try:
            return self.serializer_action_classes[self.action]
        except (KeyError, AttributeError):
            return super(ClassView, self).get_serializer_class()
        
       def add_remove_students(self, request, *args, **kwargs):
       """ 
       serializer class used is AddStudentstoClassSerializer
       """
       def get_all_students_of_a_class(self,request,pk=None):
       """
       for this I function too, I want to use the same AddStudentstoClassSerializer class but 
       there is a problem. The field students_in_class is already defined as pkfield, whereas I
       want to use it as a stringfields in the response of this function
       """"

Мой сериализатор:

class AddStudentstoClassSerializer(serializers.ModelSerializer):
    students_in_class = serializers.PrimaryKeyRelatedField(
        many=True, queryset=Student.objects.all()
    )

    class Meta:
        model = Class
        fields = ["students_in_class"]
        depth = 1

    def update(self, instance, validated_data):
        slug = self.context["slug"]
        stu = validated_data.pop("students_in_class")
        /................other codes....../
        return instance

Здесь мы видим, что student_in_class определен как pkfield, что нормально при использовании update api, но когда я хочу использовать get api и вызвать get_all_students_of_a_class, я хочу, чтобы поле было stringfield или каким-то другим полем. Как это сделать? Также depth= 1 не работает.

Вы можете переопределить метод to_representation следующим образом.

class AddStudentstoClassSerializer(serializers.ModelSerializer):
    students_in_class = serializers.PrimaryKeyRelatedField(
        many=True, queryset=Student.objects.all()
    )

    class Meta:
        model = Class
        fields = ["students_in_class"]
    
    def to_representation(self, instance):
        data = {
            "students_in_class": # Write your logic here
        }
        return data

    def update(self, instance, validated_data):
        slug = self.context["slug"]
        stu = validated_data.pop("students_in_class")
        /................other codes....../
        return instance
Вернуться на верх