Django 模型中的对象总数

Posted

技术标签:

【中文标题】Django 模型中的对象总数【英文标题】:Total count of objects in Django Model 【发布时间】: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,还是在视图中设置某种类型的查询。

【问题讨论】:

【参考方案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 。将更新答案 如果我想在计算中使用这个值,我可以这样做吗?如果是这样,这个“计数”是否需要在模型中作为方法或属性来完成?

以上是关于Django 模型中的对象总数的主要内容,如果未能解决你的问题,请参考以下文章

DJANGO - 仅针对模型中的某些对象将管理面板的权限分配给用户

Django 模型中的有序列表

django 模型中 e=Emp.objects.all() 中的“对象”是啥

自定义 Django 模型字段中的“对象没有属性”

响应 Django 中的模型更改?

Django - 从模型中的所有对象中获取第一个属性