Django使用外键查询的最佳实践

Rob*_*b B 3 django django-templates django-models django-views

models.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)
Run Code Online (Sandbox Code Playgroud)

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})
Run Code Online (Sandbox Code Playgroud)

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 %}
Run Code Online (Sandbox Code Playgroud)

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

Yuj*_*ita 5

如果只有一个子类别的深度,则以下代码不应成为问题:

{% for category in c %}
    <h1>{{ category.name }}</h1>
    <ul>
        {% for sub in category.subcatergory_set.all %}
            <li>{{ sub.name }}</li>
        {% endfor %}
    </ul>
{% endfor %}
Run Code Online (Sandbox Code Playgroud)

但是,有一些优化技巧可以减少查询计数,因为您每个循环都在进行查询.我现在想想一个.

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

您的方法使用2个查询.我的方法是使用django实践,但会进行多次查询.

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

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