简体   繁体   中英

Total count of objects in Django Model

Using Django ~=1.11 and Python 3.6

I am a beginner! Every answer I've found online for my question is more advanced than what I'm looking for.

Here's my model:

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

    def __str__(self):
        return self.text  

Here's my view:

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

Here's my template:

{% 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 %}

This allows the creation "Byte" objects in the /admin, with only one field - a small text field. Right now, the template simply displays a list of all the objects created.

Question/Problem: I'd like to display the total number/count of objects that have been created for the Byte model. In the template, I have a tag {{ byte.count }} to display this.

I've tried using count() and Aggregation, but not sure how to work those into my model/view/template. I'm looking for the most simple and up-to-date way to accomplish this, whether it's using a method or @property in the model, or some type of query set in the view.

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})

And in template

 {{ byte }}

You've got a few different options... the most common ways to get the total number of model instances I have seen are:

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

or, without having to run the full query:

my_total = Byte.objects.count()

Here's a link to the resource doc for 1.11: https://docs.djangoproject.com/en/1.11/topics/db/aggregation/#cheat-sheet

There's nothing wrong with Exprator's answer, but one alternative is to use the built in length template filter:

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

If you're not planning to iterate over the bytes queryset you could also call count on it directly in the template:

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

That will force a second database query, though, so only do that if you aren't otherwise causing bytes to be evaluated.

The decision of what to put in the view and what to do with template filters/no-arg methods is more a question of style than a hard and fast rule. Erring on the side of using the view is usually right, here it's simple enough that I might just do it in the template.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM