【问题标题】:Total count of objects in Django ModelDjango 模型中的对象总数
【发布时间】:2017-11-24 16:51:16
【问题描述】:

使用 Django ~=1.11 和 Python 3.6

我是初学者!我在网上为我的问题找到的每个答案都比我正在寻找的更先进。

这是我的模型:

class Byte(models.Model):
    text = models.CharField(max_length=30)

    def __str__(self):
        return self.text  

这是我的看法:

def byte_list(request):
    bytes = Byte.objects.order_by('text')
    return render(request, 'cloudapp/byte_list.html', {'bytes': bytes})

这是我的模板:

{% block content %}
    <div class="total">
        <h2>Total number of words and phrases entered: {{ byte.count }}</h2>
    </div>
<hr>
{% for byte in bytes %}
    <div class="byte">
        <h2>{{ byte.text }}</h2>
    </div>
{% endfor %}
{% endblock %}

这允许在 /admin 中创建“字节”对象,只有一个字段 - 一个小文本字段。现在,模板只是显示所有已创建对象的列表。

问题/问题:我想显示已为 Byte 模型创建的对象的总数/计数。在模板中,我有一个标签 {{ byte.count }} 来显示这个。

我尝试过使用 count() 和聚合,但不确定如何将它们应用到我的模型/视图/模板中。我正在寻找最简单和最新的方法来实现这一点,无论是在模型中使用方法或@property,还是在视图中设置某种类型的查询。

【问题讨论】:

    标签: python django django-models django-templates django-views


    【解决方案1】:

    您有几个不同的选择...获取我见过的模型实例总数的最常见方法是:

    my_total = len(Byte.objects.filter())
    

    或者,无需运行完整的查询:

    my_total = Byte.objects.count()
    

    这是 1.11 资源文档的链接:https://docs.djangoproject.com/en/1.11/topics/db/aggregation/#cheat-sheet

    【讨论】:

    • 谢谢。这是放在模型还是视图中?
    • 绝对是在视图中,您实际上想要对返回的值执行某些操作...例如,您可以有 50 个实例,然后在视图中运行上述内容并传递变量 @987654324 @ 到您的模板或其他任何内容中,表示“您有 {{ my_total }} 字节对象”。
    • 谢谢。我的眼睛睁得更大了。
    【解决方案2】:

    Exprator 的回答没有问题,但另一种选择是使用内置的length 模板过滤器:

    <h2>Total number of words and phrases entered: {{ bytes|length }}</h2>
    

    如果您不打算遍历 bytes 查询集,您也可以直接在模板中调用 count

    <h2>Total number of words and phrases entered: {{ bytes.count }}</h2>
    

    不过,这将强制执行第二次数据库查询,因此只有在您没有导致 bytes 被评估时才这样做。

    决定在视图中放置什么以及如何使用模板过滤器/无参数方法更多的是风格问题,而不是硬性规定。使用视图的错误通常是正确的,这里很简单,我可以在模板中做。

    【讨论】:

    • 谢谢!我忘了在模板中过滤。问题是......我想在另一个计算中使用这个值。我忘了提这个。
    • 如果你用它做计算,一定要在视图中做。
    【解决方案3】:
    def byte_list(request):
        byte= Byte.objects.count()
        bytes = Byte.objects.order_by('text')
        return render(request, 'cloudapp/byte_list.html', {'bytes': bytes,'byte':byte})
    

    在模板中

     {{ byte }}
    

    【讨论】:

    • 一般来说听起来不错,但如果您仍然需要查询集,文档建议将查询集加载到内存中并使用lencount()len 快如果你不加载它,但这里需要 bytes 所以 {'bytes': bytes, 'byte_count': len(bytes)} 可能会更快。 docs.djangoproject.com/en/1.11/ref/models/querysets/#count
    • 谢谢。我将如何在模板中呈现它?如果我进行此更改,它不会显示任何内容。
    • 无论您在上下文字典中使用什么键(@Exprator 版本中的byte,我的评论中为byte_count)都可以作为上下文变量使用,因此只需{{ byte_count }} 即可。跨度>
    • 很抱歉忘记在模板中提及它将是 {{ byte }}。将更新答案
    • 如果我想在计算中使用这个值,我可以这样做吗?如果是这样,这个“计数”是否需要在模型中作为方法或属性来完成?
    猜你喜欢
    • 2013-11-07
    • 1970-01-01
    • 1970-01-01
    • 2018-12-19
    • 2019-10-15
    • 1970-01-01
    • 2011-09-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多