2017-08-12 10 views
0

私は、タイトルまたは説明の用語の投稿を検索する検索フィールドを作成し、一致するすべての投稿のリストを返します。Djangoでどのフィールドの照合結果を並べ替えるには?

def search(request): 
    term = request.GET.get('q') 
    posts = models.Post.objects.filter(
     Q(title__icontains=term) | Q(description__icontains=term) 
    ) 
    return render(request, 'posts/post_list.html', {'posts': posts}) 

これは動作しますが、私は、検索語を含むタイトルと記事はタイトルは検索用語が含まれていませんが、説明がないところそれらに続いて、最初に表示されるように結果を注文したいと思います。

私はそうのようにそれらをINGの2つのクエリとunionを作成してみました:

good_matches = models.Post.objects.filter(
     Q(title__icontains=term)) 
just_ok_matches = models.Post.objects.filter(
     ~Q(title__icontains=term) & Q(description__icontains=term) 
    ) 
posts = good_matches | just_ok_matches 

しかし、順序が最初の例と変わらないように思われます。

This SO answerは、スコアリングシステムを作成することで、生のSQLでこれを行う方法をカバーしているようです。おそらくDjangoのORMでこれを実装する方法がありますか?

答えて

1

Djangoが準備した後、dbに1つのクエリを行いますが、あなたはたとえば、リストに変換するクエリセットで力を呼び出すことができます。

good_matches = models.Post.objects.filter(
     Q(title__icontains=term)) 
just_ok_matches = models.Post.objects.filter(
     ~Q(title__icontains=term) & Q(description__icontains=term) 
    ) 
posts = list(good_matches) + list(just_ok_matches) 
+0

ええOK私は怠けているクエリセットを考え出しが問題でした。これは動作します - ありがとう! –

関連する問題