You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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,运行以下查询语句确认返回结果是否有重复:
    from yourapp.models import Bindll
    # 替换为你实际搜索的关键词
    tarname = Bindll.objects.filter(targetnameassignedbycuratorordatasource__contains="HIV-1 protease")
    print(len(tarname))
    print([obj.id for obj in tarname])
    
    如果输出的id均不相同,说明表中确实存在多条内容重复的记录,你可以根据业务需要清理重复数据,或者直接给查询语句添加distinct()方法去重:
    tarname = Bindll.objects.filter(targetnameassignedbycuratorordatasource__contains=ChemSearched).distinct()
    

内容的提问来源于stack exchange,提问作者Ab6578

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 13:45:07