当前位置:   article > 正文

Django prefetch_related()方法

Django prefetch_related()方法

prefetch_related的作用

prefetch_related()是 Django ORM 中用于优化查询性能的另一个重要方法,尤其在处理多对多(ManyToMany)关系和反向关系时非常有用。它允许你预加载相关对象,从而减少数据库查询次数。

1,创建应用

Test/app13

 python manage.py startapp app13

2,注册应用

Test/Test/settings.py

3,添加应用路由

  1. from django.contrib import admin
  2. from django.urls import path, include
  3. urlpatterns = [
  4. path('app13/', include('app13.urls')),
  5. ]

4,添加模型

Test/app13/models.py

  1. from django.db import models
  2. class Author(models.Model):
  3. name = models.CharField(max_length=100)
  4. class Book(models.Model):
  5. title = models.CharField(max_length=100)
  6. authors = models.ManyToManyField(Author)
  7. class Review(models.Model):
  8. book = models.ForeignKey(Book, on_delete=models.CASCADE)
  9. rating = models.IntegerField()

 

5,添加视图函数

Test/app13/views.py

  1. from django.shortcuts import render
  2. from .models import Book, Author, Review
  3. def book_list(request):
  4. # 使用 prefetch_related 预加载作者和评论信息
  5. books = Book.objects.prefetch_related('authors', 'review_set').all()
  6. # 准备传递给模板的上下文
  7. context = {
  8. 'books': books,
  9. }
  10. # 渲染并返回响应
  11. return render(request, '13/book_list.html', context)

 

 6,添加html代码

Test/templates/13/book_list.html

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title</title>
  6. </head>
  7. <body>
  8. {% for book in books %}
  9. <h2>{{ book.title }}</h2>
  10. <h3>Authors:</h3>
  11. <ul>
  12. {% for author in book.authors.all %}
  13. <li>{{ author.name }}</li>
  14. {% endfor %}
  15. </ul>
  16. <h3>Reviews:</h3>
  17. <ul>
  18. {% for review in book.review_set.all %}
  19. <li>Rating: {{ review.rating }}</li>
  20. {% endfor %}
  21. </ul>
  22. {% endfor %}
  23. </body>
  24. </html>

7,添加路由地址

 Test/app13/urls.py

  1. from django.urls import path
  2. from . import views
  3. urlpatterns = [
  4. path('book_list/', views.book_list, name='book_list'),
  5. ]

 

 8,添加数据

Test/populate_db.py

  1. import random
  2. import os
  3. import django
  4. os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'Test.settings')
  5. django.setup()
  6. from app13.models import Author, Book, Review
  7. # 创建随机作者
  8. for _ in range(10):
  9. author = Author(name=f'Author {_}')
  10. author.save()
  11. # 创建随机书籍
  12. for _ in range(20):
  13. book = Book(title=f'Book Title {_}')
  14. book.save()
  15. # 随机选择1-3个作者
  16. authors = Author.objects.all()
  17. book.authors.set(random.sample(list(authors), random.randint(1, 3)))
  18. # 创建随机评论
  19. for _ in range(50):
  20. review = Review(
  21. book=random.choice(Book.objects.all()),
  22. rating=random.randint(1, 5)
  23. )
  24. review.save()

 

 9,访问页面

http://127.0.0.1:8000/app13/book_list/

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/煮酒与君饮/article/detail/851828
推荐阅读
相关标签
  

闽ICP备14008679号