Django ORM Performance Booster Tips
There are several ways to boost up the Django’s ORM performance. I am going to point out some of these after studying about this topic.
1. Using cache property of Django:
queryset = Post.objects.all() # will not hit the database
print(queryset) # will hit the database
print(queryset[:100]) # will hit the database
print(queryset[101:200] # will hit the databaseWe can use django’s cache property for reducing database hit on every line of code execution.
queryset = Post.objects.all() # will not hit the database
bool(queryset) # queryset will be evaluated
and results will be cached.
# Now queryset will use the cache data.print(queryset) # will not hit the database
print(queryset[:100]) # will not hit the database
print(queryset[101:200] # will not hit the databaseCount
2. Using select_related() and prefetch_related():
select_related() : Foreign key, one-to-one relationship query without doing hit on the database again and again. To know details: Click Here.
prefetch_related():Many-to-many, many-to-one relationship without doing hit on the database again and again. To know details: Click Here.
3. Providing index to fields in database models & provide default ordering:
3. Using list values of queryset objects instead of using Subquery() if possible:
authors = Author.objects.all()
books = Books.objects.filter(author__in=authors)In this scenario, it will hit database 3 times,
First time, when author__in = authors,
Get MSI Shafik’s stories in your inbox
Join Medium for free to get updates from this writer.
Second time, when it will get filter() method,
Third time, when executing books queryset.
Instead of this, list can be use for optimizing the performance:
authors = Author.objects.values_list('id', flat=True) # will return a flat value list of author idbooks = Books.objects.filter(author_id__in=authors)
4. Using iterator() for large queryset when no cache query data is needed :
Use of iterator() method is very effective for large queryset if cache data is not needed for further code execution.
# will Save memory but not caching anything
# only for single execution of large querysetfor book in Books.objects.iterator():
... something....
5. Using defer() or only(), values() or values_list() for avoiding unnecessary query data:
defer()- click here , only()- click here
6. Avoiding database queries in loop or work on database rather than in python:
Avoiding database queries in loop, rather than use different ORM method such as —aggregate, annotate, Max, Min, Count and so on.
max_price = 0for book in Book.objects.all(): if book.price>max_price: max_price = book.price
Instead of doing that type of query, do this-
max_price = Book.objects.all().aggregate(Max('price'))['price__max'][Thanks for being with me. If you find any inconsistency please let me know … :) ]







