prefetch_related的作用
prefetch_related()是 Django ORM 中用于優化查詢性能的另一個重要方法,尤其在處理多對多(ManyToMany)關系和反向關系時非常有用。它允許你預加載相關對象,從而減少數據庫查詢次數。
1,創建應用
Test/app13
python manage.py startapp app13
2,注冊應用
Test/Test/settings.py
3,添加應用路由
from django.contrib import admin
from django.urls import path, includeurlpatterns = [path('app13/', include('app13.urls')),
]
4,添加模型
Test/app13/models.py
from django.db import modelsclass Author(models.Model):name = models.CharField(max_length=100)class Book(models.Model):title = models.CharField(max_length=100)authors = models.ManyToManyField(Author)class Review(models.Model):book = models.ForeignKey(Book, on_delete=models.CASCADE)rating = models.IntegerField()
?
5,添加視圖函數
Test/app13/views.py
from django.shortcuts import render
from .models import Book, Author, Reviewdef book_list(request):# 使用 prefetch_related 預加載作者和評論信息books = Book.objects.prefetch_related('authors', 'review_set').all()# 準備傳遞給模板的上下文context = {'books': books,}# 渲染并返回響應return render(request, '13/book_list.html', context)
?
?6,添加html代碼
Test/templates/13/book_list.html
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>{% for book in books %}<h2>{{ book.title }}</h2><h3>Authors:</h3><ul>{% for author in book.authors.all %}<li>{{ author.name }}</li>{% endfor %}</ul><h3>Reviews:</h3><ul>{% for review in book.review_set.all %}<li>Rating: {{ review.rating }}</li>{% endfor %}</ul>
{% endfor %}</body>
</html>
7,添加路由地址
?Test/app13/urls.py
from django.urls import path
from . import viewsurlpatterns = [path('book_list/', views.book_list, name='book_list'),
]
?
?8,添加數據
Test/populate_db.py
import randomimport os
import djangoos.environ.setdefault('DJANGO_SETTINGS_MODULE', 'Test.settings')
django.setup()
from app13.models import Author, Book, Review# 創建隨機作者
for _ in range(10):author = Author(name=f'Author {_}')author.save()# 創建隨機書籍
for _ in range(20):book = Book(title=f'Book Title {_}')book.save()# 隨機選擇1-3個作者authors = Author.objects.all()book.authors.set(random.sample(list(authors), random.randint(1, 3)))# 創建隨機評論
for _ in range(50):review = Review(book=random.choice(Book.objects.all()),rating=random.randint(1, 5))review.save()
?
?9,訪問頁面
http://127.0.0.1:8000/app13/book_list/
?