 <p>Depends on how large your DB is, and how frequent the stats are changed.</p> <p>If it not that large, you can use query sets freely and create the appropriate indexes, and use some cache mechanism so you will not have to make the same queries all over again.</p> <p>But if it is very big database, and it takes a lot of resources to get the data back, I would create some schedule tasks, or use Django signals to collect data as the some order occurs.</p> <p>Another option always is to use 3rd-party tool to do all of this.</p>