Как мне регистрировать отфильтрованные запросы GET в модельном наборе Django REST Framework ModelViewSet с помощью @action?

У меня есть ModelViewSet для EventReportLink, и мне нужно регистрировать каждый раз, когда кто-то запрашивает ?event_report__id=<id>. Я пробовал добавить пользовательский @action(detail=False, methods=['get']), но я не уверен, правильно ли я его реализую или есть способ получше.

Я добавил:

@action(detail=False, methods=['get'], url_path='log-test')
def log_test(self, request):
    event_report_id = request.query_params.get('event_report__id')
    logger.info(f"ID: {event_report_id}")
    queryset = self.filter_queryset(self.get_queryset())
    serializer = self.get_serializer(queryset, many=True)
    return Response(serializer.data)

Ожидаю логов и корректных результатов фильтрации. Я получаю отфильтрованные результаты, но не уверен, что это наилучшая практика. Какой подход был бы более идиоматичным?

P.S. Я также ознакомился с этим связанным вопросом, в котором обсуждается, как добавить поведение до / после логики по умолчанию create, используя super().create(request). Однако я не был полностью уверен, применимо ли это к моему случаю с фильтрацией параметров запроса и ведением журнала с помощью @action, поэтому я все еще изучаю лучшие практики.

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

Например, вы хотите подключить list метод вашего ModelViewSet, который определен внутри ListModelMixin.

Вы могли бы записать этот метод в свой набор представлений следующим образом:

    def list(self, request, *args, **kwargs):
        event_report_id = request.query_params.get('event_report__id')
        logger.info(f"ID: {event_report_id}")
        return super().list(request, *args, **kwargs)
Вернуться на верх