Django-filter: DRF 集成不适用于额外的视图集操作

创建于 2018-08-16  ·  9评论  ·  资料来源: carltongibson/django-filter

通过使用此处所述的@action装饰器,我在单个视图集中有多个列表操作,并通过此处的文档中指定的 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='retrieve_by_card_no/(<int:CardNo>)')
def getByCarNo(self, request, CardNo):
用户 = get_object_or_404(employe_model, EmpCardNo=CardNo)
返回响应(序列化程序。EmployeeInfoSerializer(用户)。数据,状态=状态。HTTP_200_OK)

我想用他的卡号而不是员工ID来搜索员工

任何人都可以帮助我吗?

如果您在 URL 中传递查询参数以及您的操作,我认为过滤器集成可以正常工作。 以下是我采取的行动

@action(methods=['GET'], detail=False)
def export(self, request): 
    queryset = self.get_queryset()
    filtered_queryset = self.filter_queryset(queryset)

尝试从 DRF 可浏览 API 调用导出操作时,发送的请求是
/api/viewname/export/应该像这样调用
/api/viewname/export/?query_param_1=value1&?query_param_2=value2

将查询参数与操作一起传递将调用 filterset 类,因此您将在 filters_queryset 变量中获得一个过滤的查询集

非常感谢我想通了

2021 年 4 月 28 日星期三上午 12:32 Mohammed Sunasra @* >
写道:

如果您通过查询,我认为过滤器集成可以正常工作
参数以及您在 URL 中的操作。 以下是我采取的行动

@action(methods=['GET'], detail=False)
def 导出(自我,请求):
查询集 = self.get_queryset()
filters_queryset = self.filter_queryset(queryset)

当尝试从 DRF 可浏览 API 调用导出操作时,请求
被发送的是
/api/viewname/export/应该像这样调用
/api/viewname/export/?query_param_1=value1&?query_param_2=value2

将查询参数与操作一起传递将调用过滤器集
类,因此您将在filtered_queryset中获得一个过滤的查询集
多变的


您收到此消息是因为您发表了评论。
直接回复此邮件,在 GitHub 上查看
https://github.com/carltongibson/django-filter/issues/967#issuecomment-828220562
或退订
https://github.com/notifications/unsubscribe-auth/AMD2QQXC6FGISRWTHRAGUSTTK62Y7ANCNFSM4FP6FMMQ
.

此页面是否有帮助?
0 / 5 - 0 等级