V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
mywaiting
V2EX  ›  问与答

问个技术问题: HTML 表单中 MutilpleSelect 有大量的待选数据该如何优化?

  •  
  •   mywaiting · 2019-02-23 15:51:28 +08:00 · 878 次点击
    这是一个创建于 1906 天前的主题,其中的信息可能已经有所发展或是发生改变。

    编写 HTML 表单,有 MutilpleSelect 选择框,本来也没有啥特别的,用了 Python WTForms 处理表单的 data validate,待选的数据直接默认传入 form.tags.choices = [....] 就可以了

    然而上线后发现这样粗糙的方法根本招架不住,因为这个 MutilpleSelect 选择框对应选择的整个数据库的 tags 标签,而整个数据库的 tags 标签数量有几十万

    这样 form.tags.choices = TagsORM.query.fetchall() 瞬间内存就爆满了

    google 多方搜索,得到的也是用 Select2 (貌似 V2 这里都有用到),我仔细看过文档,发现就是采用 search 大量的数据然后将需要用的 json 数据放到页面上,但是,很多的细节,比如:

    1. 如果表单带有默认的 tags 该如何处理和显示
    2. search 大量数据是否需要优化后端的 mysql index
    3. 对于 Select2 这个与 WTForms 的配合,网上的资料尤其少

    有同学在用 WTForms+Select2 的吗?能否分享一下看法?如果有更好的资料,麻烦丢个链接

    谢谢!

    第 1 条附言  ·  2019-02-23 23:18:27 +08:00

    经过一个晚上的 debug 顺利解决

    1. 表单带有默认 tags 的,那么 WTForms 直接设置 XXXForm.xxxField.default = [....] 即可,前端 select2 插件会根据你的默认 option 自动转换并显示出来

    2. 几十万的数据,mysql index 不需要优化用 %like% 查询已经很快。再大的数据我手上没有,没法测试。

    3. Select2 这个与 WTForms 完全没有问题,也完全不相干。唯一的就是 WTForms 的 MutilpleSelect 会默认检查表单已有的 choices,不在 choices 里面就抛出 validate error,这个很简单的,只需要自己 overwrite 这个 wtforms.SelectMultipleField 的 pre_validate 为空即可

    最后带个今晚的小坑,要在 MySQL 里面存 emoji 表情,记得将MySQL 全部的字符串字符集都改为 utf8mb4 并且 version > 5.5 不然的话,error throw 得你怀疑人生!

    2 条回复    2019-02-23 18:08:37 +08:00
    jugelizi
        1
    jugelizi  
       2019-02-23 16:47:19 +08:00
    逻辑有问题啊 不是先放热门标签
    用户输入自动匹配吗
    mywaiting
        2
    mywaiting  
    OP
       2019-02-23 18:08:37 +08:00
    @jugelizi #1 现在就是这样的逻辑啊,用户输入,然后 auto complete 返回后端已经有的 tag id

    问题不是在于 新建 条目插入 tag,而是 编辑 已有的条目增删 tag

    特别是配合 WTForms+Select2,想找个现成的例子,懒得自己写了............
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   6073 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 03:41 · PVG 11:41 · LAX 20:41 · JFK 23:41
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.