У меня есть несколько действий списка в одном наборе представлений, используя декоратор @action , как описано здесь , и я включил FilterSet через filter_class, как указано в документах здесь . Фильтры применяются только к действиям ViewSet List и Retrieve по умолчанию, а не к каким-либо пользовательским действиям List или Retrieve, где нам действительно нужны фильтры.
Привет @estianross. Вам необходимо предоставить более подробную информацию, если мы собираемся прокомментировать.
Вы уверены, что ваши дополнительные действия вызывают filter_queryset()
?
Они делают, но я совершенно уверен, что использую его не так, как следует использовать, если проблема именно в этом. Я включил простой образец действия ниже, чтобы показать основы того, что я делаю в этих действиях.
@action(methods=['GET'], detail=False)
def simplelist(self, request, *args, **kwargs):
serializer = SpecializedModelListSerializer(self.filter_queryset(self.get_queryset()), many=True)
return Response(serializer.data, status=status.HTTP_200_OK)
Я предлагаю вам создать APITestCase и подключить к нему параметры URL + запроса, которые вы ожидаете. Затем вы сможете делать утверждения и вставлять точки останова по мере необходимости, чтобы увидеть, где что-то идет не так.
(Боюсь, что без более подробной информации невозможно вообще что-либо посоветовать.)
Я заработал, просто переместив вызов следующим образом
@action(methods=['GET'], detail=False)
def simplelist(self, request, *args, **kwargs):
qs = self.filter_queryset(self.get_queryset())
serializer = SpecializedModelListSerializer(qs, many=True)
return Response(serializer.data, status=status.HTTP_200_OK)
Спасибо за помощь!!!
Кажется, это не работает в большинстве моих случаев.
Я думаю, что этот вопрос должен быть вновь открыт. У меня такая же проблема, и предложенное решение сработало для меня.
@action(methods=['get'], detail=True, url_path='retrive_by_card_no/(< int:CardNo> )')
def getByCarNo(self, request, CardNo):
пользователь = get_object_or_404 (employe_model, EmpCardNo = CardNo)
вернуть ответ (сериализаторы.EmployeeInfoSerializer(пользователь).данные, статус=статус.HTTP_200_OK)
Я хочу искать сотрудника по номеру его карты вместо идентификатора сотрудника
кто-нибудь может мне помочь?
Я думаю, что интеграция с фильтром работает правильно, если вы передаете параметры запроса вместе с вашим действием в URL-адресе. Ниже было действие, которое у меня было
@action(methods=['GET'], detail=False)
def export(self, request):
queryset = self.get_queryset()
filtered_queryset = self.filter_queryset(queryset)
При попытке вызвать действие экспорта из API для просмотра DRF отправленный запрос был
/api/viewname/export/ вместо этого он должен вызываться как
/api/имя представления/экспорт/?query_param_1=value1&?query_param_2=value2
Передача параметров запроса вместе с действием вызовет класс набора фильтров, и, следовательно, вы получите отфильтрованный набор запросов в переменной filtered_queryset.
Спасибо большое я разобрался
В среду, 28 апреля 2021 г., в 00:32 Мохаммед Сунасра @ . * >
написал:
Я думаю, что интеграция с фильтром работает правильно, если вы передаете запрос
params вместе с вашим действием в URL. Ниже было действие, которое у меня было@action(методы=['GET'], деталь=ложь)
def экспорт (я, запрос):
набор запросов = self.get_queryset()
filtered_queryset = self.filter_queryset (набор запросов)При попытке вызвать действие экспорта из API для просмотра DRF запрос
что было отправлено было
/api/viewname/export/ вместо этого он должен вызываться как
/api/имя представления/экспорт/?query_param_1=value1&?query_param_2=value2Передача параметров запроса вместе с действием вызовет набор фильтров
class и, следовательно, вы получите отфильтрованный набор запросов в filtered_queryset
Переменная—
Вы получаете это, потому что вы прокомментировали.
Ответьте на это письмо напрямую, просмотрите его на GitHub
https://github.com/carltongibson/django-filter/issues/967#issuecomment-828220562 ,
или отписаться
https://github.com/notifications/unsubscribe-auth/AMD2QQXC6FGISRWTHRAGUSTTK62Y7ANCNFSM4FP6FMMQ
.
Самый полезный комментарий
Я заработал, просто переместив вызов следующим образом
Спасибо за помощь!!!