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 管理和自动完成灯:Select2:找不到 jQuery 实例或 jQuery 兼容库