36

Does anyone know if there's a way to just select the number of rows matching a query in Django? I have a search I've written that splits results into sets of 40, but I'd like to display the total number of results as well. I could to something like len(Model.objects.filter(name__icontains=search)), but it seems like that would be grossly inefficient (since I'm assuming that would generate a "SELECT * FROM model" and then all of the resulting objects). Any suggestions?

3 Answers 3

58

Use count():

>>> Model.objects.count()
42
>>> Model.related_set.count()
102
>>> Model.related_set.filter(blah=42).count()
3
Sign up to request clarification or add additional context in comments.

Comments

48

There are two main ways to handle this:

  1. Use Django's count() QuerySet method — simply append count() to the end of the appropriate QuerySet
  2. Generate an aggregate over the QuerySet — Aggregation is when you "retrieve values that are derived by summarizing or aggregating a collection of objects." Ref: Django Aggregation Documentation

The links above are to the applicable sections of Django's documentation.

1 Comment

Thanks, aggregate did the trick. It's kind of strange; I had to do an aggregate(Count('id')).count() (counting my count?). I'm happy though as long as it's hopefully only pulling up a number though and not all of the data in the table.
0

For all row count of a table/model:

pattern:

Model.objects.count()

example:

User.objects.count()

For specific row count of a table/model:

pattern:

Model.objects.filter(user__id=1).count()

example:

User.objects.filter(user__id=1).count()

For further info please visit: https://docs.djangoproject.com/en/4.1/topics/db/aggregation/

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.