2

ユーザーが特定のしきい値基準を満たすモデルのインスタンスを検索できるようにする検索ページを構築しようとしていますが、非常に冗長なコードを回避するのに苦労しています。もっと良い方法があることを願っています。これは、私がやろうとしていることを説明するために少し不自然な例であり、関連するコードは最後に調整されています。ユーザーは、チェックボックスを使用して検索を操作します。

models.py:

class Icecream(models.Model()):
    name = models.CharField()
    bad_threshold = models.IntegerField()
    okay_threshold = models.IntegerField()
    tasty_threshold = models.IntegerField()
    delicious_threshold = models.IntegerField()

ビュー.py:

def search_icecreams(request):
    user = request.user
    q_search = None

    if 'taste_search' in request.GET: 
        q_search = taste_threshold_set(request, user, q_search)

    if q_search == None:
        icecream_list = Icecream.objects.order_by('name')
    else:
        icecream_list = College.objects.filter(q_search)

    context = { 'icecream_list' : icecream_list }
    return render(request, '/icecream/icecreamsearch.html', context)

削減したい関連コードは次のとおりです。これは、名前が変更された、私のプロジェクトからほとんどそのままです。

def taste_threshold_set(request, user, q_search):
    threshold = request.GET.getlist('taste_search')
    user_type_tolerance = user.profile.get_tolerance_of(icea

    # 1-5 are the various thresholds. They are abbreviated to cut down on the
    # length of the url.
    if '1' in threshold:
        new_q = Q(bad_threshold__gt = user.profile.taste_tolerance)        

        if q_search == None:
            q_search = new_q
        else:
            q_search = (q_search) | (new_q)

    if '2' in threshold:
        new_q = Q(bad_threshold__lte=user.profile.taste_tolerance) & \
            ~Q(okay_threshold__lte=user.profile.taste_tolerance)

        if q_search == None:
            q_search = new_q
        else:
            q_search = (q_search) | (new_q)

    if '3' in threshold:
        new_q = Q(okay_threshold_3__lte=user.profile.taste_tolerance) & \
            ~Q(tasty_threshold__lte=user.profile.taste_tolerance)

        if q_search == None:
            q_search = new_q
        else:
            q_search = (q_search) | (new_q)

    if '4' in threshold:
        new_q = Q(tasty_threshold__lte=user.profile.taste_tolerance) & \
            ~Q(delicious_threshold__lte=user.profile.taste_tolerance)

        if q_search == None:
            q_search = new_q
        else:
            q_search = (q_search) | (new_q)

    if '5' in threshold:
        new_q = Q(delicious_threshold__lte = user.profile.taste_tolerance)        

        if q_search == None:
            q_search = new_q
        else:
            q_search = (q_search) | (new_q)

    return q_search

基本的に、ユーザーが特定のしきい値レベルを満たす特定のオブジェクトのすべてのインスタンスを見つけられるようにしたいと考えています。したがって、たとえば、彼らが悪いと思うすべてのアイスクリームと、彼らがおいしいと思うすべてのアイスクリーム.

このコードには満足できない点がいくつかあります。可能なしきい値ごとに Q オブジェクトがまだインスタンス化されていないかどうかを確認するのは好きではありませんが、それを回避する方法がわかりません。さらに、これがジャンゴ以外の問題である場合は、ループを使用して、指定されたしきい値をそれぞれ書き出すのではなく、それぞれをチェックします。しかし、繰り返しますが、それを行う方法がわかりません。

最後に、最大の問題は、モデルのおそらく 20 の異なる属性のしきい値を確認する必要があることです。現状では、それぞれに対して新しいしきい値チェッカーを作成する必要がありますが、それぞれが他とわずかに異なるだけです (チェックしている属性の名前)。一般的なチェッカーを作成して、特定の属性を渡すことができるようになりたいと思っています。これ、または他の2つの問題を解決する方法はありますか?

ありがとう!

4

2 に答える 2

1

このアプローチはどうですか?

query_arg = ['bad_threshold__lte', 'bad_threshold__lte', 'okay_threshold_3__lte', 'tasty_threshold__lte', 'delicious_threshold__lte']

Q(**{query_arg[int(threshold) - 1]: user.profile.taste_tolerance})
于 2013-06-21T03:40:49.210 に答える