Django对接PostgreSQL按名称搜索返回重复QuerySet结果问题求助
问题排查与解决方法
1. 模板循环逻辑错误(首要原因)
你在模板的for循环中遍历tarname这个QuerySet时,循环变量设为Bindll,但实际输出时错误调用了整个tarname对象,相当于每遍历到一个元素,就把完整QuerySet输出一次。如果QuerySet内有3条数据,就会重复输出3次完整QuerySet,这是你看到重复内容的直接原因。
修复方法:把循环内的输出改成对应循环变量即可,修改后的模板代码如下:
#Search results page. {% extends 'Search/base.html' %} {% block content %} <center> <br/><br/><br/><br/> <h1> {% if ChemSearched %} {{ ChemSearched }} <br><br> {% for item in tarname %} {{ item }}<br> {% endfor %} {% else %} <strong>No Entry</strong> {% endif %} Copyright (c) </h1> </center> {% endblock %}
建议将循环变量名从Bindll改为更通用的item,避免和模型类名混淆,降低代码歧义。
2. 数据库存在重复数据的排查与修复
如果修改模板后仍然出现重复条目,说明PostgreSQL数据库的Bindll表中确实存在多条targetnameassignedbycuratorordatasource字段值包含搜索关键词的重复记录:
- 你可以先在Git Bash中进入Django shell验证:执行
python manage.py shell,运行以下查询语句确认返回结果是否有重复:
如果输出的id均不相同,说明表中确实存在多条内容重复的记录,你可以根据业务需要清理重复数据,或者直接给查询语句添加from yourapp.models import Bindll # 替换为你实际搜索的关键词 tarname = Bindll.objects.filter(targetnameassignedbycuratorordatasource__contains="HIV-1 protease") print(len(tarname)) print([obj.id for obj in tarname])distinct()方法去重:tarname = Bindll.objects.filter(targetnameassignedbycuratorordatasource__contains=ChemSearched).distinct()
内容的提问来源于stack exchange,提问作者Ab6578
相关产品推荐
相关产品推荐

