【问题标题】:How to combine multiple querysets and remove duplicates?如何组合多个查询集并删除重复项?
【发布时间】:2014-01-27 15:14:30
【问题描述】:

我正在使用 Django 1.6.1 和 django-taggit。

我正在尝试扩展我的搜索引擎,以便它在标签字段之外的其他字段中搜索关键字。问题是,当我在模型名称中遍历标签以进行 icontains 搜索时,查询集似乎不再是查询集,失去了它的计数方法,并且 distinct 方法不起作用。

views.py:

def index(request):
    numresources = Resource.objects.count()

    if request.method == 'POST':
        form = SearchForm(request.POST)
        if form.is_valid():
            query = form.cleaned_data['query']
            tags = parse_tags(query.lower())

#            resourcelist = []
#            for tag in tags:
#                resourcelist.extend(Resource.objects.filter(name__icontains=tag).filter(isActive=True).order_by('-score').distinct())
#            resourcelist.extend(Resource.objects.filter(tags__name__in=tags).filter(isActive=True).order_by('-score').distinct())
#            numresults = len(resourcelist)

            resourcelist = Resource.objects.filter(tags__name__in=tags).filter(isActive=True).order_by('-score').distinct()
            querymade = True
            numresults = resourcelist.count()
        else:
            resourcelist = Resource.objects.filter(isActive=True).order_by('-created')[:100]
    else:
        resourcelist = Resource.objects.filter(isActive=True).order_by('-created')[:100]
        form = SearchForm()

    return render(request, 'index.html', locals())

将“django”关键字添加到标题或网址中包含“django”的记录似乎很笨重。我不仅希望其标签与用户输入的关键字匹配的结果,而且我希望在其他字段中搜索输入的关键字,组合这些查询集,并保留添加两次或更多的任何结果。

那么在这个过程中,我如何以及何时按分数排序,然后删除重复项?

【问题讨论】:

    标签: django django-queryset django-taggit


    【解决方案1】:

    我认为你想要这样的东西:

    from django.db.models import Q
    
    Resource.objects.filter(Q(name__icontains=tag) | Q(tags__name__in=tags)).filter(isActive=True).order_by('-score').distinct()
    

    Q objects documentation

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-10-09
      • 2014-07-08
      • 2013-09-06
      • 2021-08-05
      • 2019-03-19
      • 1970-01-01
      • 1970-01-01
      • 2011-01-09
      相关资源
      最近更新 更多