rest_framework_mongoengine实现搜索

直接只用rest_framework的搜索会不起作用

settings

    'DEFAULT_FILTER_BACKENDS': [
        'rest_framework.filters.SearchFilter',  # 模糊搜索
        # 'django_filters.rest_framework.DjangoFilterBackend'  # 精准搜索(完全匹配)
    ]

view

# 资产类型
class CiTypeViewSet(ModelViewSet):
    queryset = CiType.objects.all()
    serializer_class = CiTypeSerializer
    permission_classes = [
        IsAuthenticated,
        CmdbModelPermissions]  # 注意权限,不然会报错 <class 'AttributeError'> 'QuerySet' object has no attribute 'model'
    search_fields = ['name']  # 模糊搜索的字段域

那么就需要重写filter_backends,经过研究只需要重写filter_queryset就行了,最终view如下

为rest_framework_mongoengine改进view

复制代码
# 资产类型
class CiTypeViewSet(ModelViewSet):
    queryset = CiType.objects.all()
    serializer_class = CiTypeSerializer
    # filter_backends = [SearchFilter] 自定义搜索类
    permission_classes = [
        IsAuthenticated,
        CmdbModelPermissions]  # 注意权限,不然会报错 <class 'AttributeError'> 'QuerySet' object has no attribute 'model'
    search_fields = ['name']  # 模糊搜索的字段域

    def filter_queryset(self, queryset):  # 兼容mongo搜索,重写filter_queryset
        search = self.request.query_params.get('search')
        # 通过先封装成一个字典再用**运算符解包,完美解决
        if search:
            q = Q()
            for field in self.search_fields:
                zip_field = {field + '__icontains': search}
                q = q | Q(**zip_field)
            queryset = queryset.filter(q)
        return queryset
复制代码

 

参考文章:https://blog.csdn.net/weixin_42144277/article/details/105839070

posted @   豆浆D  阅读(177)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
历史上的今天:
2019-11-18 sh命令
点击右上角即可分享
微信分享提示