Django 外键查询最佳实践

2024-01-04

模型.py

class Category(models.Model):
    name = models.CharField(max_length=50)

class SubCatergory(models.Model):
    parent_category = models.ForeignKey(Category)
    name = models.CharField(max_length=100)

views.py

def all_products(request):
c = Category.objects.all()
s = SubCatergory.objects.all()

return render_to_response('all_products.html',
                          {'c':c, 's':s})

all_products.html

{% for category in c %}
    <h1>{{ category.name }}</h1>
    <ul>
        {% for sub in s  %}
        {% if category.id == sub.parent_category.id %}
            <li>{{ sub.name }}</li>
        {% endif %}
        {% endfor %}
    </ul>
{% endfor %}

只是想知道上述是否是外键查询的最佳实践。我正在模板级别进行过滤(如果category.id == sub...),我应该将其移至模型或视图级别吗?


如果子类别只有一种深度,则以下代码应该不会有问题:

{% for category in c %}
    <h1>{{ category.name }}</h1>
    <ul>
        {% for sub in category.subcatergory_set.all %}
            <li>{{ sub.name }}</li>
        {% endfor %}
    </ul>
{% endfor %}

但是有一些优化技巧可以减少查询计数,因为您将在每个循环中执行一个查询。我现在正在想一个。

实际上,我开始认为这是一个有趣的问题:最佳实践?

您的方法使用 2 个查询。我的方法是使用 django 实践,但执行多个查询。

为了防止多次查询,您基本上必须在视图中的模板中执行相同的操作,即迭代SubCatergory,在 python 中提取它们的 ID 并将每个 ID 集分组到属性上Category.

我不知道这个问题的答案。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Django 外键查询最佳实践 的相关文章

随机推荐