2

次の関数は、すべてのカテゴリとサブカテゴリを取得し、テンプレートに渡します。基本的に、topcategory にはありcategory id = 1ます。そのため、上位のカテゴリを親として持つカテゴリを取得し、次にそれらのサブカテゴリを取得します。問題は、このコードに基づくクエリが最大 90 個あることです。この情報をレンダリングし、データベース呼び出しの数を削減するためのより効率的な方法を誰かが提案できるかどうか疑問に思っていますか?

def all_models(request):
    topcats = Category.objects.filter(parent=1).order_by('category')
    subcats = {}
    for each in topcats:
        subcats [each] = []
        subcategories = Category.objects.filter (parent= each.id).order_by('category')
        for subcat in subcategories:
            subcats[each].append(subcat)
    return render_to_response("parts/all.html", {
        "topcats":topcats,
        "subcats": subcats,
    }, context_instance=RequestContext(request))
4

1 に答える 1

1
topcats = Category.objects.prefetch_related('category_set').filter(parent_id=1).order_by('category')

related_nameモデルでforを指定した場合は、もちろんその名前parentに置き換える必要があります。category_set

これにより、必要なすべてのカテゴリがわずか 2 つのクエリで取得されます。モデル自体で順序を定義したい場合やcategory、サブカテゴリで順序付けできない場合があります。次に、テンプレートで次のことができます。

{% for topcat in topcats %}
    - {{ topcat.category }}
    {% for subcat in topcat.category_set.all %}
        -- {{ subcat.category }}
    {% endfor %}
{% endfor %}
于 2013-08-13T18:48:32.893 に答える