H4KKR
H4KKR

Reputation: 64

How do I find each instance of a model in Django

I am trying to iterate through each instance of a model I have defined.

Say I have the following in models.py, under the people django app:

class foo(models.Model):
    name = models.CharField(max_length=20, default="No Name")
    age = models.PositiveSmallIntegerField(default=0)

And I have populated the database to have the following data in foo:

  1. name="Charley", age=17
  2. name="Matthew", age=63
  3. name="John", age=34

Now I want to work out the average age of my dataset. In another part of the program (outside the people app, inside the project folder), in a file called bar.py that will be set up to run automatically every day at a specific time, I calculate this average.

from people.models import foo
def findAverageAge():
    total = 0
    for instance in //What goes here?// :
        total += instance.age
    length = //What goes here, to find the number of instances?//
    average = total / length
    return average
print(findAverageAge)

In the code above, the //What goes here?// signifies I don't know what goes there and need help.

Upvotes: 1

Views: 331

Answers (1)

willeM_ Van Onsem
willeM_ Van Onsem

Reputation: 476584

You can retrieve all elements with .all() [Django-doc]:

from people.models import foo

def findAverageAge():
    total = 0
    qs = foo.objects.all()
    for instance in :
        total += instance.age
    length = len(qs)
    average = total / length
    return average

print(findAverageAge())

But you should not calculate the average at the Django/Python level. This requires retrieving all records, and this can be quite large. A database itself can calculate the average, and this is (normally) done in a more efficient way. You can .aggregate(…) [jango-doc] on the queryset with:

from people.models import foo

def findAverageAge():
    return foo.objects.aggregate(
        avg_age=Avg('age')
    )['avg_age'] or 0

print(findAverageAge())

You should make a management command however: this will load the Django apps, and also makes it more convenient to run command with parameters, etc.

Upvotes: 4

Related Questions