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, 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/

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/800166.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

技术成神之路:设计模式(七)状态模式

1.介绍 状态模式&#xff08;State Pattern&#xff09;是一种行为设计模式&#xff0c;它允许一个对象在其内部状态改变时改变其行为。这个模式将状态的相关行为封装在独立的状态类中&#xff0c;并将不同状态之间的转换逻辑分离开来。 2.主要作用 状态模式的主要作用是让一个…

16001.WSL2 ubuntu20.04 编译安装 vsomeip

文章目录 1 vsomeip 编译安装1.1 vsomeip的安装1.2 编译提示错误1.3 编译hello_world示例1.4 运行服务器端 1 vsomeip 编译安装 1.1 vsomeip的安装 参考博文 https://blog.csdn.net/peterwanye/article/details/128386539 1.2 编译提示错误 ubuntu1-BJ-EE1000042:~/opt/vso…

科研绘图系列:R语言分组散点图(grouped scatter plot)

介绍 分组连线散点图是一种高效的数据可视化手段,它通过在散点图上添加线条来明确展示数据点的分组情况。这种图形能够显著地突出不同组之间的差异,为读者提供了一种直观且易于理解的方式来识别数据的聚类结构。相较于传统的散点图,分组连线散点图在展示数据分组信息方面更…

linux centos limits.conf 修改错误,无法登陆问题修复 centos7.9

一、问题描述 由于修改/etc/security/limits.conf这个文件中的值不当&#xff0c;重启后会导致其账户无法远程登录&#xff0c;本机登录。 如改成这样《错误示范》&#xff1a; 会出现&#xff1a; 二、解决 现在知道是由于修改limits.conf文件不当造成的&#xff0c;那么就…

MyBatis框架学习笔记(四):动态SQL语句、映射关系和缓存

1 动态 SQL 语句-更复杂的查询业务需求 1.1 动态 SQL-官方文档 &#xff08;1&#xff09;文档地址: mybatis – MyBatis 3 | 动态 SQL &#xff08;2&#xff09;为什么需要动态 SQL 动态 SQL 是 MyBatis 的强大特性之一 使用 JDBC 或其它类似的框架&#xff0c;根据不同条…

PHP多功能投票微信小程序系统源码

&#x1f389;一键决策&#xff0c;尽在掌握&#xff01;多功能投票小程序&#xff0c;让选择不再纠结&#x1f914; &#x1f4f2;【开篇&#xff1a;告别传统&#xff0c;拥抱便捷投票新时代】&#x1f4f2; 还在为组织投票活动手忙脚乱&#xff1f;或是面对众多选项犹豫不…

数据库:编程(打开、操作(增、删、改、查)、关闭)

一、需要的头文件 sqlite3.h 二、编译过程 gcc xxx -lsqlite3 三、编程框架 打开数据库 》读写数据库(增&#xff0c;删&#xff0c;改&#xff0c;查) 》关闭数据库 3.1 打开数据库&#xff1a; sqlite3_open int sqlite3_open(char * path,sqlite3 ** db); 功能&…

无人机之机架类型篇

碳纤维机架 具有低密度、高强度和高刚度的特点&#xff0c;非常适合商业或工业级无人机的设计。碳纤维机架在飞行过程中具有良好的减振效果&#xff0c;使飞行更加稳定&#xff0c;但制作工艺复杂&#xff0c;成本较高。 工程塑料机架 以其轻便、耐冲击和易加工等特点受到一…

SpringCloud | 单体商城项目拆分(微服务)

为什么要进行微服务拆分&#xff1f; 在平常的商城项目中&#xff0c;我们一般的项目结构模块都是将各种业务放在同一个项目文件夹&#xff0c;比如像&#xff1a; 用户&#xff0c;购物车&#xff0c;商品&#xff0c;订单&#xff0c;支付等业务都是放在一起&#xff0c;这样…

SpringBoot以及swagger的基本使用

1、SpringBoot是什么&#xff1f; 一种快速开发、启动Spring的框架、脚手架 遵循“约定优于配置”的思想&#xff0c;使得能够快速创建和配置Spring应用 2、SpringBoot的核心特性 自动配置&#xff0c;一些依赖、默认配置都预设好了&#xff0c;减少了配置量起步依赖&#x…

Docker的安装【虚拟机】

Docker的安装【虚拟机】 1、查看是否含有旧版本 yum list installed|grep docker2、安装docker仓库 yum -y install yum-utils3、设置docker仓库 # 清理 yum 的所有缓存 yum clean all # 更新并生成 yum 软件仓库的元数据缓存&#xff0c;确保系统使用的软件信息是最新的 y…

ASP.NET MVC-制作可排序的表格组件-PagedList版

环境&#xff1a; win10 参考&#xff1a; 学习ASP.NET MVC(十一)——分页 - DotNet菜园 - 博客园 https://www.cnblogs.com/chillsrc/p/6554697.html ASP.NET MVCEF框架实现分页_ef 异步分页-CSDN博客 https://blog.csdn.net/qq_40052237/article/details/106599528 本文略去…

嵌入式linux相机 框图

摄像头读取数据显示到LCD流程 重点&#xff1a;摄像头数据&#xff08;yuyv&#xff0c;mjpeg&#xff0c;rgb&#xff09;&#xff08;640,320&#xff09;与LCD显示数据&#xff08;RGB&#xff09;&#xff08;480&#xff0c;240&#xff09;不同&#xff1b;需要转换&…

数据结构——考研笔记(三)线性表之单链表

文章目录 2.3 单链表2.3.1 知识总览2.3.2 什么是单链表2.3.3 不带头结点的单链表2.3.4 带头结点的单链表2.3.5 不带头结点 VS 带头结点2.3.6 知识回顾与重要考点2.3.7 单链表的插入和删除2.3.7.1 按位序插入&#xff08;带头结点&#xff09;2.3.7.2 按位序插入&#xff08;不带…

如何使用 GPT?

​通过实例&#xff0c;来展示如何最好地使用 GPT。 生成文字 假设你在写一篇文章&#xff0c;需要在结尾加上这样一句&#xff1a;「California’s population is 53 times that of Alaska.」&#xff08;加州的人口是阿拉斯加州的 53 倍&#xff09;。 但现在你不知道这两个…

Git钩子Hook功能

&#x1f4be; Hook 钩子 目录 &#x1f514; 简介&#x1f514; 常见类型&#x1f514; 如何配置&#x1f514; 使用场景&#x1f514; 示例 &#x1f514; 简介 Git Hooks是Git内置的一种机制&#xff0c;允许在特定事件发生时执行自定义脚本。Git Hook可以在客户端和服务器端…

SpringBoot整合阿里云RocketMQ对接,商业版

1.需要阿里云开通商业版RocketMQ 普通消息新建普通主题,普通组,延迟消息新建延迟消息主题,延迟消息组 2.结构目录 3.引入依赖 <!--阿里云RocketMq整合--><dependency><groupId>com.aliyun.openservices</groupId><artifactId>ons-client</…

[论文笔记]构建基于RAG聊天机器人的要素

引言 今天带来一篇构建RAG的论文笔记&#xff1a;FACTS About Building Retrieval Augmented Generation-based Chatbots。 基于生成式人工智能构建企业聊天机器人迅速成为行业中最受关注的应用之一&#xff0c;旨在提高员工生产力。 然而&#xff0c;构建成功的企业聊天机器…

爬虫-requests和Selenium

1、了解requests的功能 1.1 使用post和get发送请求 HTTP中常见发送网络请求的方式有两种&#xff0c;GET和POST。GET是从指定的资源请求数据&#xff0c;POST是向指定的资源提交要被处理的数据。 GET的用法&#xff1a; import requestsr requests.get("https://www.…

随机过程基础:2.Markov (马尔可夫)过程(2)

纯生过程和纯灭过程 纯生过程&#xff1a;想象一下一个生物种群&#xff0c;比如一群兔子&#xff0c;在没有天敌的理想环境中&#xff0c;食物充足&#xff0c;疾病不存在。在这样的环境下&#xff0c;兔子的种群只会增加&#xff0c;不会减少。纯生过程模型就是用来描述这种情…