您的位置:首页 > 娱乐 > 明星 > Django prefetch_related()方法

Django prefetch_related()方法

2024/10/5 20:47:19 来源:https://blog.csdn.net/qq_26086231/article/details/140449651  浏览:    关键词:Django prefetch_related()方法

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/

 

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com