首页 > 解决方案 > Django,jquery,基于数据库的自动完成,改进

问题描述

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

@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 列的名称,感谢您的帮助。

标签: jqueryjsondjango

解决方案


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

方法values_listDjango-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上,您可以传递位置参数 (* fields ) 以指定应应用 DISTINCT 的字段的名称。这将转换为 SELECT DISTINCT ON SQL 查询。这就是区别。对于普通的 distinct() 调用,数据库在确定哪些行是不同的时比较每一行中的每个字段。对于具有指定字段名称的 distinct() 调用,数据库将仅比较指定的字段名称。


推荐阅读