【问题标题】:Optimizing Database Queries in Django With Categories and Subcategories使用类别和子类别优化 Django 中的数据库查询
【发布时间】:2013-08-15 12:09:23
【问题描述】:

以下函数获取所有类别和子类别,然后将它们传递给模板。基本上,顶级类别有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))

【问题讨论】:

  • 查询所有类别,遍历它们并在代码中构建类别树。
  • 你能贴一些代码吗——我试过了,但没用。

标签: python django optimization query-optimization


【解决方案1】:
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 %}

【讨论】:

    猜你喜欢
    • 2012-02-20
    • 2012-07-10
    • 1970-01-01
    • 1970-01-01
    • 2020-12-10
    • 2011-12-14
    • 2017-10-28
    • 2015-10-15
    • 1970-01-01
    相关资源
    最近更新 更多