Effectively using Django's QuerySets
Object-relational mapping (ORM) makes interacting with SQL databases simpler, but it is also considered to be inefficient and slower than raw SQL.
To use an ORM effectively means understanding how it queries the database. In this article I will focus on how to effectively use the Django ORM system to access medium to large data sets.
Django’s queryset is lazy
Django's queryset corresponds to several records (rows) in the database, filtered through optional queries. For example, the following code will get all the people named ‘Dave’ in the database:
person_set = Person.objects.filter(first_name="Dave")
The above code does not run any database queries. You can use person_set, add some filter conditions to it, or pass it to a function, and these operations will not be sent to the database. This is correct because database queries are one of the factors that significantly affect the performance of web applications.
To actually get data from the database, you need to traverse queryset:
for person in person_set: print(person.last_name)
Django’s queryset has cache
When you iterate over a queryset, all matching records are retrieved from the database and converted into a Django model. This is called evaluation. These models will be saved in the queryset's built-in cache, so that if you iterate through the queryset again, you don't need to re-run the general query.
For example, the following code will only execute a database query once:
pet_set = Pet.objects.filter(species="Dog") # The query is executed and cached. for pet in pet_set: print(pet.first_name) # The cache is used for subsequent iteration. for pet in pet_set: print(pet.last_name)
The if statement will trigger the execution of queryset
The most useful thing about queryset cache is that it can effectively test whether the queryset contains data. It will only be traversed when there is data:
restaurant_set = Restaurant.objects.filter(cuisine="Indian") # `if`语句会触发queryset的执行。 if restaurant_set: # 遍历时用的是cache中的数据 for restaurant in restaurant_set: print(restaurant.name)
If you don’t need all the data, queryset cache may be a problem
Sometimes, you may just want to know whether data exists without traversing all the data. In this case, simply using an if statement to make a judgment will completely execute the entire queryset and put the data into the cache, even though you don't need the data!
city_set = City.objects.filter(name="Cambridge") # `if`语句会执行queryset.。 if city_set: # 我们并不需要所有的数据,但是ORM仍然会获取所有记录! print("At least one city called Cambridge still stands!")
In order to avoid this, you can use the exists() method to check whether there is data:
tree_set = Tree.objects.filter(type="deciduous") # `exists()`的检查可以避免数据放入queryset的cache。 if tree_set.exists(): # 没有数据从数据库获取,从而节省了带宽和内存 print("There are still hardwood trees in the world!")
When the queryset is very large, cache will become a problem
When processing thousands of records, loading them into memory all at once is wasteful. What's worse is that a huge queryset may lock the system process and bring your program to the verge of crash.
To avoid generating the queryset cache while traversing the data, you can use the iterator() method to obtain the data and discard it after processing the data.
star_set = Star.objects.all() # `iterator()`可以一次只从数据库获取少量数据,这样可以节省内存 for star in star_set.iterator(): print(star.name)
Of course, using the iterator() method to prevent cache generation means that queries will be executed repeatedly when traversing the same queryset. So be careful when using iterator() and make sure your code does not repeatedly execute queries when operating on a large queryset
If the query set is large, the if statement is a problem
As mentioned before, the queryset cache is powerful for combining if statements and for statements, which allows conditional loops on a queryset. However, for very large query sets, query set caching is not suitable.
The simplest solution is to use exists() in conjunction with iterator() to avoid using the queryset cache by using two database queries.
molecule_set = Molecule.objects.all() # One database query to test if any rows exist. if molecule_set.exists(): # Another database query to start fetching the rows in batches. for molecule in molecule_set.iterator(): print(molecule.velocity)
A more complicated solution is to use Python's "advanced iteration method" to look at the first element of iterator() before starting the loop and then decide whether to loop.
atom_set = Atom.objects.all() # One database query to start fetching the rows in batches. atom_iterator = atom_set.iterator() # Peek at the first item in the iterator. try: first_atom = next(atom_iterator) except StopIteration: # No rows were found, so do nothing. pass else: # At least one row was found, so iterate over # all the rows, including the first one. from itertools import chain for atom in chain([first_atom], atom_set): print(atom.mass)
Prevent improper optimization
Queryset's cache is used to reduce the program's queries to the database. Under normal use, it will ensure that the database will only be queried when needed.
Use the exists() and iterator() methods to optimize the program's use of memory. However, since they do not generate queryset cache, they may cause additional database queries.
So you need to pay attention when coding. If the program starts to slow down, you need to see where the bottlenecks in the code are and whether there are some small optimizations that can help you.
The above is the detailed content of Effectively using Django's QuerySets. For more information, please follow other related articles on the PHP Chinese website!

Hot AI Tools

Undresser.AI Undress
AI-powered app for creating realistic nude photos

AI Clothes Remover
Online AI tool for removing clothes from photos.

Undress AI Tool
Undress images for free

Clothoff.io
AI clothes remover

AI Hentai Generator
Generate AI Hentai for free.

Hot Article

Hot Tools

Notepad++7.3.1
Easy-to-use and free code editor

SublimeText3 Chinese version
Chinese version, very easy to use

Zend Studio 13.0.1
Powerful PHP integrated development environment

Dreamweaver CS6
Visual web development tools

SublimeText3 Mac version
God-level code editing software (SublimeText3)

Hot Topics



Steps to check the Django version: 1. Open a terminal or command prompt window; 2. Make sure Django has been installed. If Django is not installed, you can use the package management tool to install it and enter the pip install django command; 3. After the installation is complete , you can use python -m django --version to check the Django version.

Django and Flask are both leaders in Python Web frameworks, and they both have their own advantages and applicable scenarios. This article will conduct a comparative analysis of these two frameworks and provide specific code examples. Development Introduction Django is a full-featured Web framework, its main purpose is to quickly develop complex Web applications. Django provides many built-in functions, such as ORM (Object Relational Mapping), forms, authentication, management backend, etc. These features allow Django to handle large

Django is a complete development framework that covers all aspects of the web development life cycle. Currently, this framework is one of the most popular web frameworks worldwide. If you plan to use Django to build your own web applications, then you need to understand the advantages and disadvantages of the Django framework. Here's everything you need to know, including specific code examples. Django advantages: 1. Rapid development-Djang can quickly develop web applications. It provides a rich library and internal

How to check the django version: 1. To check through the command line, enter the "python -m django --version" command in the terminal or command line window; 2. To check in the Python interactive environment, enter "import django print(django. get_version())" code; 3. Check the settings file of the Django project and find a list named INSTALLED_APPS, which contains installed application information.

The differences are: 1. Django 1.x series: This is an early version of Django, including versions 1.0, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 1.7, 1.8 and 1.9. These versions mainly provide basic web development functions; 2. Django 2.x series: This is the mid-term version of Django, including 2.0, 2.1, 2.2 and other versions; 3. Django 3.x series: This is the latest version series of Django. Including versions 3.0, 3, etc.

How to upgrade Django version: steps and considerations, specific code examples required Introduction: Django is a powerful Python Web framework that is continuously updated and upgraded to provide better performance and more features. However, for developers using older versions of Django, upgrading Django may face some challenges. This article will introduce the steps and precautions on how to upgrade the Django version, and provide specific code examples. 1. Back up project files before upgrading Djan

django is the backend. Details: Although Django is primarily a backend framework, it is closely related to front-end development. Through features such as Django's template engine, static file management, and RESTful API, front-end developers can collaborate with back-end developers to build powerful, scalable web applications.

Django, Flask, and FastAPI: Which framework is right for beginners? Introduction: In the field of web application development, there are many excellent Python frameworks to choose from. This article will focus on the three most popular frameworks, Django, Flask and FastAPI. We will evaluate their features and discuss which framework is best for beginners to use. At the same time, we will also provide some specific code examples to help beginners better understand these frameworks. 1. Django: Django
