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

Django filter查询集返回重复对象 搜索结果去重问题咨询

你遇到的搜索结果重复问题,本质是Django ORM 跨多对多关联表查询时的默认行为导致的:当你的查询条件包含tags__name__icontains时,只要一个Article/Qa对象绑定了多个符合查询条件的标签,这个对象就会在结果中被返回多次。

1. 搜索结果页视图修改

给search_articles视图中的两个查询结果添加.distinct()去重,同时优化冗余查询逻辑,修改后代码如下:

@login_required
def search_articles(request):
    query = request.GET.get('q')
    article = Article.objects.none()
    qa_list = QA.objects.none()
    if query is not None:
        lookups = Q(title__icontains=query) | Q(tags__name__icontains=query)
        # 末尾加distinct移除重复对象
        article = Article.objects.filter(lookups).distinct()
        qa_list = QA.objects.filter(lookups).distinct()
    context = {
        'search_articles': article,
        'query_name': query,
        'qa_list': qa_list
    }
    return render(request, 'search/search_articles.html', context)

2. 自动补全接口修改

你当前的自动补全接口存在两个问题:一是address_objects or address_objects_qa逻辑只会遍历其中一个查询集,不会同时返回两类内容的标题;二是没有做去重处理,修改后代码如下:

@login_required
def search_address_qa(request):
    query = request.GET.get('title')
    payload = []
    if query:
        lookups = Q(title__icontains=query)
        # 直接取title字段,不需要实例化完整对象,查询效率更高
        article_titles = Article.objects.filter(lookups).values_list('title', flat=True)
        qa_titles = QA.objects.filter(lookups).values_list('title', flat=True)
        # 合并结果后去重,需要保留原始排序的话可以换成遍历判断的方式去重
        payload = list(set(list(article_titles) + list(qa_titles)))
    return JsonResponse({'status':200, 'data': payload})

如果需要保留搜索结果的原始排序,可以把去重逻辑替换为:

all_titles = list(article_titles) + list(qa_titles)
seen = set()
for title in all_titles:
    if title not in seen:
        payload.append(title)
        seen.add(title)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 20:45:04