【问题标题】:Django - using count in templateDjango - 在模板中使用计数
【发布时间】:2012-10-14 15:36:46
【问题描述】:

我有一个简单的问题。

在我的模板文件中,我有两次相同的变量{{ category.photo_set.count }}

例如:

        <div class="galleries">

            <div class="row">
            {% for category in categories %}
                <div class="five columns{% cycle " alpha" "" " omega" %}">

                    <div class="image"><a href="{% url gallery.views.category category.slug %}"><img src="{{ MEDIA_URL }}{{ category.image }}" alt="" /></a></div>

                    <h4>{{ category.name }}</h4>       
                    <p>Ilość zdjęć: {{ category.photo_set.count }}</p>  

                    {%  if category.photo_set.count > 0 %}<a class="button" href="{% url gallery.views.category category.slug %}">zobacz</a>{% endif %}
                </div>
            {% endfor %}

            </div>

        </div>

我注意到这段代码对数据库生成了两个完全相同的查询。

30 Query    SELECT COUNT(*) FROM `gallery_photo` WHERE `gallery_photo`.`category_id` = 1
30 Query    SELECT COUNT(*) FROM `gallery_photo` WHERE `gallery_photo`.`category_id` = 1

如何防止这种情况发生?

【问题讨论】:

    标签: sql django model django-templates


    【解决方案1】:

    这是 with 模板标签的一个很好的用例:https://docs.djangoproject.com/en/dev/ref/templates/builtins/#with

    你只想用

    包装块
    {% with photo_count=category.photo_set.count %}
    ...
    {{photo_count}}
    ...
    {% endwith %}
    

    【讨论】:

    • 我还有一个问题,使用单个查询获取所有包含照片数量的画廊的最佳方法是什么。现在我有Gallery.objects.all().order_by('position'),然后计算在模板中,但它会为每个画廊生成查询。
    • 好的。我发现:from django.db.models import Count Gallery.objects.all().annotate(Count('photo')).order_by('position')
    猜你喜欢
    • 2017-09-18
    • 1970-01-01
    • 2015-09-07
    • 2020-08-03
    • 2021-08-09
    • 2022-01-22
    • 2018-11-25
    • 2019-05-23
    • 2015-07-20
    相关资源
    最近更新 更多