Использование пользовательской функции внутри ModelViewset в Django rest framework

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

Недавно я столкнулся с кодом, написанным с использованием ModelViewset. Здесь вместо list, create, destroy определяется пользовательская функция. Например, функция с именем **"get_all_students_questions"**. Вот фрагмент ниже:

class QandaApiViewSet(viewsets.ModelViewSet, PusherMixin):
    """
    Viewset that returns the paginated Qanda Details.
    """

    queryset = Qanda.objects.all().order_by("-created_at")
    serializer_class = QandaModelSerializers

    def get_pusher_settings(self):
        setting = Setting.objects.filter(slug="pusher").first()
        if setting:
            return setting.settings
        return None

    def create(self, request):
        """
        The method that accepts the form data to save the data as
        Qanda instance.
        """

        serializer = self.get_serializer(data=request.data)
        if serializer.is_valid(raise_exception=True):

            validated_data = serializer.validated_data
            image_content = validated_data.get("content")
            subject = validated_data.get("subject")
            """
            cms_content contains the cms data in which base64 image are converted to aws url image
            and content_Writing contains the image_url to those aws url image.
            """
            cms_content, content_writing = parse_image_from_editor(image_content)

            new_data = {
                "content": cms_content,
                "content_writing": content_writing,
                "subject": subject,
                "student": request.user,
            }

            qanda = Qanda(**new_data)
            qanda.save()
            data = {"data": cms_content, "response": "Submitted Successfully"}
            """
            Sending notification to admin side
            """
            try:
                # getting pusher credientals from database
                pusher_client = self.get_pusher_credentials(self.get_pusher_settings())
                qanda_serialized = QandaModelSerializers(qanda).data
                # sending notification where expert-qa is event type
                pusher_client.send_notification(
                    "expert-qa", json.dumps(qanda_serialized)
                )
            except Exception:
                pass
            return Response(data)

    def get_student_questions(self, request, *args, **kwargs):
        """
        Function that accepts the get method which returns the list of questions asked
        by the particular users.
        """

        queryset = self.queryset.filter(student=request.user)
        serializer = self.serializer_class(queryset, many=True, read_only=True)
        return Response(serializer.data)

    def list(self, request, *args, **kwargs):
        """
        Method that returns the list of questions.
        Accepts query params subject_id
        """

        subject_id = request.query_params.get("subject_id", None)
        queryset = self.queryset
        if subject_id:
            queryset = self.queryset.filter(subject_id=subject_id)
        serializer = self.serializer_class(queryset, many=True, read_only=True)
        return Response(serializer.data)

В приведенном выше фрагменте мы видим такие функции, как get_student_questions и get_pusher_settings. Так можем ли мы использовать пользовательские функции с пользовательскими именами, как описано выше в ModelViewset? Если да, то как проложить маршрут к этим функциям из одной конечной точки api? url определяется следующим образом:

router = DefaultRouter()
router.register(r"question/submit", users.QandaApiViewSet)

urlpatterns = [
    path(
        "my-questions/list/",
        users.QandaApiViewSet.as_view({"get": "get_student_questions"}),
    )
]

Так когда же этот get_student_questions будет вызван из вышеупомянутого url?

Второй вопрос: можно ли использовать эти пользовательские функции в APIView так же, как в ModelViewset?

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