python - 使用类别和子类别优化 Django 中的数据库查询

标签 python django optimization query-optimization

以下函数获取所有类别和子类别,然后将它们传递给模板。基本上,topcategory 有 category id = 1 —— 所以我们得到任何以 top 类别作为父类别的类别,然后我们得到它们的子类别。问题是我们有大约 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))

最佳答案

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

如果您在模型中为 parent 指定了 related_name,您当然应该用该名称替换 category_set

这将在两个查询中获取所有需要的类别。您可能希望在模型本身上定义排序,否则您将无法按 category 对子类别进行排序。然后,在您的模板中,您可以:

{% for topcat in topcats %}
    - {{ topcat.category }}
    {% for subcat in topcat.category_set.all %}
        -- {{ subcat.category }}
    {% endfor %}
{% endfor %}

关于python - 使用类别和子类别优化 Django 中的数据库查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18216501/

相关文章:

python - 并发访问应用引擎中的数据存储

python - 在 For 循环中获取属性名称

python - UpdateAPIView 不工作 : Method "PATCH" not allowed

python - Linux Apache Django 视频静态文件问题

javascript - 比较 jquery 选择器的性能

java - 我的 Python-Java 接口(interface),好的设计?以及如何包装 JNI 函数?

python - 如何平滑类似于 d3 的 curveCardinal 方法实现的闭合线的边缘?

java - 使用 getter 或将它们分配给变量是否更有效?

python - 如何进行线程安全的 python XML 验证?

optimization - 在 Lisp 中,使用 let* 还是 setf 更惯用?