Как мне регистрировать отфильтрованные запросы 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)