python - 如何通过模型视图集上的列表/检索功能进行过滤
问题描述
任何人都知道如何在视图集的列表/检索功能上实现搜索过滤器?
我正在尝试在 ViewSet 上使用 DRF Searh-filter,但它不起作用(它不返回过滤的对象)。
我想返回的是类似 --> /store/1/locker/1/controller?controller={name_controller}
视图.py
class ControllerViewSet(viewsets.ModelViewSet):
serializer_class = ControllerSerializer
queryset = Controller.objects.all()
filter_backends = [filters.SearchFilter]
search_fields = ['controller']
def list(self, request, store_pk=None, locker_pk=None):
queryset = Controller.objects.filter(locker__store=store_pk, locker=locker_pk)
serializer = ControllerSerializer(queryset, many=True, context={'request': request})
return Response(serializer.data)
def retrieve(self, request, pk=None, store_pk=None, locker_pk=None):
queryset = Controller.objects.filter(pk=pk, locker=locker_pk, locker__store=store_pk)
locker = get_object_or_404(queryset, pk=pk)
serializer = ControllerSerializer(locker, context={'request': request})
return Response(serializer.data)
解决方案
您设置了一个过滤器后端,但随后您覆盖了将调用它的代码 ( list()
, retrieve()
)。
似乎您覆盖这些方法的唯一原因是通过存储和储物柜 pks 过滤查询集。这可以在一个地方完成以影响所有请求,而不会破坏现有代码。
def get_queryset(self):
locker_pk = self.kwargs["locker_pk"] # named parameters in url appear in self.kwargs
store_pk = self.kwargs["store_pk"]
return super().get_queryset().filter(locker=locker_pk, locker__store=store_pk)
就是这样。DRF 将调用此方法来获取查询集,按照配置对其进行过滤,并使用您的序列化程序自动序列化数据。无需手动实现已经提供的内容。
注意:确保您的 pk 对正则表达式有效。如果有人请求,您不希望您的应用程序崩溃/store/x/locker/y/controller
,对吗?正则表达式应该是\d+
任何整数。
推荐阅读
- angular - 在 TestBed.createComponent() 之前监视组件方法
- python - 计算由给定浮点数近似的最短十进制数
- bash - 尝试从变量执行小脚本,正确的语法是什么?
- c++ - 在 gdb 中使用 throw 语句跳过函数不会让我去 catch 语句
- android - 除了底部导航视图,如何使片段的布局具有屏幕高度的高度?
- ruby - 如何将当前类引用为 YARD 中的返回类型?
- excel - PySpark 中是否有等效的 ExcelWriter?
- azure-active-directory - 无法使用 Microsoft Graph API 从 Azure AD 获取订阅列表
- dart - 我正在使用 dio 库进行 http 响应,但没有更新 listview 颤振
- delphi - 是否可以在 Delphi 中为 Windows 应用商店创建 MS Office 插件?