This document summarizes techniques for optimizing performance when working with large datasets in Django. It discusses using select_related, prefetch_related, values, and values_list to retrieve data in a lean way without entire model objects. It also covers string aggregation, setdefault, and get for serializing to-many relationships efficiently. The goal is to retrieve and serialize data from the database with as few queries as possible for better performance with large amounts of data.
31. # 10k Records found
Form.objects.count()
# How many queries made?
for form in Form.objects.all():
print(form.author.name)
32. # 10k Records found
Form.objects.count()
# How many queries made?
for form in Form.objects.all():
print(form.author.name)
# 1+10k queries made!
Big-O Notation
33. # 10k Records found
Form.objects.count()
# How many queries made?
for form in Form.objects.all():
print(form.author.name)
# 1+10k queries made!
Big-O Notation
O(n+1)
36. many-to-many .prefetch_related()
# Two queries made, join done at python level
for form in Form.objects.prefetch_related('categories'):
for category in form.categories.all():
print(category.name)
O(2)
40. # 10k Records found
Form.objects.count()
# List of 10k model objects
for form in Form.objects.select_related('author'):
print(book.author.name)
fat + slow
41. skip model object
slim data retrieval
.values()
# List of 10k dictionaries
form_qs = Form.objects.values(
'application_id',
'author__name',
'categories__name',
)
for form in form_qs:
print(
f"{form['application_id']}, "
f"{form['author__name']}, "
f"{form['categories__name']}"
)
slim + quick
42. skip model object
slim data retrieval
.values_list()
# List of 10k tuples
form_qs = Form.objects.values_list(
'application_id',
'author__name',
'categories__name',
)
for application_id, author, categories in form_qs:
print(f'{application_id}, {author}, {categories}')
slim + quick
43. skip model object
slim data retrieval
.values_list()
# List of 10k tuples
form_qs = Form.objects.values_list(
'application_id',
flat=True,
)
for application_id in form_qs:
print(f'{application_id}')
slim + quick
45. from django.db import connection
# prints 0
print(len(connection.queries))
# How many queries made?
forms = list(Form.objects.values_list('id',
'categories__name'))
# prints x?
print(len(connection.queries))