10

私はdjango-taggitでDjango 1.6.1を使用しています。

タグ フィールド以外のフィールドでキーワードを検索するように、検索エンジンを拡張しようとしています。問題は、モデルの名前で icontains 検索のタグを繰り返し処理すると、クエリセットがクエリセットではなくなり、count メソッドが失われ、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())

タイトルまたは URL に「django」が含まれるレコードに「django」キーワードを追加する必要があるのは、扱いにくいようです。ユーザーが入力したキーワードとタグが一致する結果だけでなく、入力したキーワードで他のフィールドを検索し、それらのクエリセットを組み合わせて、2 回以上追加された結果を残します。

では、このプロセスのどの時点で、スコアで並べ替えてから重複を削除するのでしょうか?

4

1 に答える 1

9

私はあなたがこのようなものが欲しいと思います:

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 オブジェクトのドキュメント

于 2014-01-09T07:45:18.523 に答える