Django-filter: Интеграция DRF не работает для дополнительных действий набора представлений.

Созданный на 16 авг. 2018  ·  9Комментарии  ·  Источник: carltongibson/django-filter

У меня есть несколько действий списка в одном наборе представлений, используя декоратор @action , как описано здесь , и я включил FilterSet через filter_class, как указано в документах здесь . Фильтры применяются только к действиям ViewSet List и Retrieve по умолчанию, а не к каким-либо пользовательским действиям List или Retrieve, где нам действительно нужны фильтры.

Самый полезный комментарий

Я заработал, просто переместив вызов следующим образом

@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)

Спасибо за помощь!!!

Все 9 Комментарий

Привет @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
.

Была ли эта страница полезной?
0 / 5 - 0 рейтинги