Skip to content

Instantly share code, notes, and snippets.

for book in Books.objects.all():
do_stuff(book)
for book in Books.objects.all().iterator():
do_stuff(book)
if book.author_id:
do_stuff()
do_stuff_with_author_id(book.author_id)
if book.author:
do_stuff()
# Or
do_stuff_with_author_id(book.author.id)
>>> Author.objects.all()
SELECT "library_author"."id", "library_author"."name" FROM "library_author" LIMIT 21
Execution time: 0.001393s [Database: default]
<QuerySet [<Author: Author object>]>
>>> from django.db import connection
>>> connection.queries
[]
>>> Author.objects.all()
<QuerySet [<Author: Author object>]>
>>> connection.queries
[{u'time': u'0.002', u'sql': u'SELECT "library_author"."id", "library_author"."name" FROM "library_author" LIMIT 21'}]
class Author(models.Model):
name = models.TextField()
class Book(models.Model):
title = models.TextField()
author = models.ForeignKey(
Author, on_delete=models.PROTECT, related_name='books', null=True
)
>>> Author.objects.count()
20
>>> Book.objects.count()
100
# This block is 101 queries.
# 1 for the books and 1 for each author that lazy-loaded
books = Book.objects.all()
for book in books:
do_stuff(book.title, book.author.name)
# Retrieve values as a dictionary
>>> Book.objects.values('title', 'author__name')
<QuerySet [{'author__name': u'Nikolai Gogol', 'title': u'The Overcoat'}, {'author__name': u'Leo Tolstoy', 'title': u'War and Peace'}]>
# Retrieve values as a tuple
>>> Book.objects.values_list('title', 'author__name')
<QuerySet [(u'The Overcoat', u'Nikolai Gogol'),
(u'War and Peace', u'Leo Tolstoy')]>
>>> Book.objects.values_list('title')
<QuerySet [(u'The Overcoat',), (u'War and Peace',)]>