V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
piaochen0
V2EX  ›  Django

django admin 如何实现排除搜索

  •  
  •   piaochen0 · 2021-02-04 11:35:06 +08:00 · 2021 次点击
    这是一个创建于 1390 天前的主题,其中的信息可能已经有所发展或是发生改变。

    使用 django admin 的 search_fields 属性,可以实现搜索
    但是我现在做的,除了搜索外,还想再增加一个输入框把含有部分文字的项排除掉。
    这个有办法实现吗?

    目前能想到的是重写
    def get_search_results(self, request, queryset, search_term):
    方法,不过这个方法里也是能拿到输入框的内容吗?
    我的需求是需要再加一个排除搜索的输入框。
    不知道有没有什么方法能实现这个需求。或者有其他第三方 admin 能实现这个功能吗?

    3 条回复    2021-02-04 14:51:54 +08:00
    allisone
        1
    allisone  
       2021-02-04 11:59:52 +08:00
    我觉得可以再增加一个过滤器,过滤出不包含部分文字的数据,然后再对数据进行搜索即可
    Vegetable
        2
    Vegetable  
       2021-02-04 12:04:09 +08:00
    如果是一个输入框的话比较简单,比如 输入 [张三 -李四] ,在 get_search_results 中,对 search_term 进行处理,提取出排除条件 [-李四] ,将张三传给 super.get_search_results,查询结果再 queryset.exclude 掉李四就行了。两个框的话,需要自定义组件吧,这个不清楚啦
    zonde306
        3
    zonde306  
       2021-02-04 14:51:54 +08:00
    可以,get_search_results 参数 search_term 就是搜索框的内容(类型 str ),对 queryset 参数进行 filter 然后返回即可
    排除的话,可以考虑用数据库的全文索引,实现简单,性能尚可

    例如
    ```
    def get_search_results(self, request, queryset, search_term):
    if not search_term:
    return super().get_search_results(request, queryset, search_term)

    return queryset.filter(seo__search=search_term), False
    #end get_search_results
    ```

    ```
    class SearchLookup(models.Lookup):
    lookup_name = "search"

    def as_mysql(self, compiler, connection):
    lhs, lhs_params = self.process_lhs(compiler, connection)
    rhs, rhs_params = self.process_rhs(compiler, connection)
    params = lhs_params + rhs_params
    return "MATCH (%s) AGAINST (%s IN BOOLEAN MODE)" % (lhs, rhs), params
    #end as_mysql
    #end - SearchLookup
    ```
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1033 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 20:39 · PVG 04:39 · LAX 12:39 · JFK 15:39
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.