Django 模型中的对象总数

Ron*_*ney 5 python django django-templates django-models django-views

使用 Django ~=1.11 和 Python 3.6

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

这是我的模型:

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

    def __str__(self):
        return self.text  
Run Code Online (Sandbox Code Playgroud)

这是我的观点:

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

这是我的模板:

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

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

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

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

Dou*_*las 5

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

my_total = len(Byte.objects.filter())
Run Code Online (Sandbox Code Playgroud)

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

my_total = Byte.objects.count()
Run Code Online (Sandbox Code Playgroud)

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


Pet*_*per 2

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

<h2>Total number of words and phrases entered: {{ bytes|length }}</h2>
Run Code Online (Sandbox Code Playgroud)

如果您不打算迭代bytes查询集,您也可以count直接在模板中调用它:

<h2>Total number of words and phrases entered: {{ bytes.count }}</h2>
Run Code Online (Sandbox Code Playgroud)

不过,这将强制进行第二次数据库查询,因此只有在不以其他方式导致bytes被评估的情况下才这样做。

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