Django,jquery,基于数据库的自动完成,改进

Posted

技术标签:

【中文标题】Django,jquery,基于数据库的自动完成,改进【英文标题】:Django, jquery, database based autocomplete, improvements 【发布时间】:2021-07-13 23:46:14 【问题描述】:

大家好,我最近做了一个基于我的数据库的自动完成功能,问题是我认为它需要一些改进。例如:如果用户两次输入两次相同的值,自动完成也会两次推荐相同的值,还有升级问题我很确定当我的应用程序数据库大小增加时,这段代码可能会不好。会喜欢一些关于如何解决这些问题或一些好的替代方案的想法。 这是自动完成视图

@login_required
def AutocompleteModelo(request):
    if 'term' in request.GET:
         query=DataDB.objects.filter(modelo__istartswith=request.GET.get('term'))
         modelos=list()
         for q in query:
             modelos.append(q.modelo)
         return JsonResponse(modelos, safe=False)
    return render(request,'data.insiradado.html')

这里是自动完成的 jquery 脚本。

       <script>
            $(function () 
                $("#modelo").autocomplete(
                    source: '% url 'data-AutocompleteModelo' %',
                    minLength: 1
                );
            );
        </script>

顺便说一句,modelo 是 db 列的名称,感谢您的帮助。

【问题讨论】:

“如果用户输入两次相同的值两次,自动完成也会推荐两次相同的值”是什么意思? 自动完成显示两次smae值 【参考方案1】:

我们可以使用distinct (Django-Docs) 从查询集中删除重复行。

并且方法values_list (Django-Docs) 向我们返回一个元组查询集,然后我们使用list() 将其转换为列表。

@login_required
def AutocompleteModelo(request):
    term = request.GET.get('term')
    if term:
        modelos = list(DataDB.objects.filter(
            modelo__istartswith=request.GET.get('term')
        ).values_list(
            'modelo', flat=True
        ).order_by("modelo").distinct("modelo"))
        return JsonResponse(modelos, safe=False)
    return render(request,'data.insiradado.html')

注意:

仅在 PostgreSQL 上,您可以在 为了指定 DISTINCT 应​​该到的字段的名称 申请。这将转换为 SELECT DISTINCT ON SQL 查询。这是 区别。对于普通的 distinct() 调用,数据库比较每个 在确定哪些行不同时,每行中的字段。为一个 distinct() 调用指定的字段名称,数据库将只 比较指定的字段名称。

【讨论】:

我明白了,感谢您的帮助,不知道有这么独特的命令,以及重新编写我的代码的好方法

以上是关于Django,jquery,基于数据库的自动完成,改进的主要内容,如果未能解决你的问题,请参考以下文章

有人使用过 Django 和 JQuery 自动完成功能吗?

Django:具有多个查询集的 jQuery 自动完成

在 django 中使用 JQuery 自动完成小部件

django 管理和自动完成灯:Select2:找不到 jQuery 实例或 jQuery 兼容库

Django JQuery 自动完成功能不起作用 - 没有显示,但 API URL 有效

基于其他自动完成输入的 jQuery 自动完成选项