bugfix> python-3.x > 投稿
def autocomplete(request):
    template_name='searchresults.html'
    if 'term' in request.GET:
        qs=Post.objects.filter(Q(title__istartswith=request.GET.get('term'))|Q(content__icontains=request.GET.get('term')))
        titles=list()
        for post in qs:
            titles.append(post.title)
        return JsonResponse(titles, safe=False)
    return render(request, template_name)

用語で始まる場合は最初に、それを含むが2番目に始まらないような方法でそれらを注文するにはどうすればよいですか?

回答 1 件
  • あなたは利用することができます .union(…) [Django-doc]:

    term = request.GET.get('term')
    qs = Post.objects.filter(
        title__istartswith=term
    ).union(Post.objects.filter(
        content__icontains=term
    ))
    
    

    またはと .annotate(…) [Django-doc]:

    from django.db.models import BooleanField, ExpressionWrapper, Q
    term = request.GET.get('term')
    qs = Post.objects.filter(
        Q(title__istartswith=term) | Q(content__icontains=term)
    ).annotate(
       is_start=ExpressionWrapper(
            Q(title__istartswith=term),
            output_field=BooleanField()
        )
    ).order_by('-is_start')
    
    

あなたの答え