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, include
urlpatterns = [
path('app13/', include('app13.urls')),
]
4,添加模型
Test/app13/models.py
from django.db import models
class 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, Review
def 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 views
urlpatterns = [
path('book_list/', views.book_list, name='book_list'),
]
8,添加数据
Test/populate_db.py
import random
import os
import django
os.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/