【Django 03】QuerySet 和 Instance应用

1. DRF QuerySet 和 Instance功能概述

1.1 QuerySet

从数据库中查询结果存放的集合称为 QuerySet。 Django ORM用到三个类:Manager、QuerySet、Model。每个Model都有一个默认的
manager实例,名为objects。Django的ORM通过Mode的objects属性提供各种数据操的接口(API),并通过 Model.objects 方法返回QuerySet,生产符合查询条件的列表,列表中包含多个 Instance。
在Django中,QuerySet是一个与数据库交互的高级抽象层,它用于执行数据库查询操作和操作数据库表中的数据。QuerySet是Django的ORM(Object-Relational Mapping)系统的一部分,它允许你通过Python代码而不是SQL语句来查询和操作数据库。

class QuerySet(model=None, query=None, using=None)[source]

其具有两大特色(1) 惰性:若这个对象中包含了需要的数据且需要使用时,它会去DB中获取数据,否则不会获取。 比如说在内部,创建、过滤、切片和传递一个QuerySet,而没有进行真正的数据执行,不会真实操作数据库,被称为惰性。(2)缓存使用同一个查询集,第一次使用时会发生数据库的查询,然后Django会把结果缓存下来,再次使用这个查询集时会使用缓存的数据,减少了数据库的查询次数。

1.2 操作说明

设定:已存在数据表定义如下:

class Goods(DjangoPeople):
{
number = CharField(max_length=32, verbose_name=‘编号’)
name = CharField(max_length=64, verbose_name=‘名称’)
unit = CharField(max_length=64, verbose_name=‘单位’)
remark = CharField(max_length=256, verbose_name=‘备注’)
} 
* `all()` :返回模型的所有对象,它的效果等价于不带任何条件的 `filter()` 方法。如:  DjangoPeople.objects.all() # 查询所有 语句。*  filter()(**kwargs) 用于返回符合条件的所有数据。如:DjangoPeople.objects.filter(name=“abc”) #取出name="x"的DjangoPeople成员:又如:DjangoPeople.objects.filter(name=“x”) .filter(unit=“y”) #取出name="x"且unit="y"的DjangoPeople成员:

get() 方法与 filter() 的作用类似,用于返回符合条件的单个对象但是可能会返回多个值

delete() :可以删除符合条件的所有对象

如:catagories_to_delete=DjangoPeople.objects.filter(name=“abc”)
deleted_count= categories_to_delete.delete()

update() :将符合条件的所有对象的某个字段值进行更新

create()save() 方法的快捷方式,用于创建并保存一个新的对象。

如:created_category = DjangoPeople.objects.create(name=“abc”)

count() :返回符合条件的对象数量

order_by() :对返回的对象进行排序,默认为升序。降序则在字段名前面加负号。

查询数据:你可以使用QuerySet来查询数据库中的数据。例如,你可以执行filter()、get()、exclude()等方法,以获取匹配特定条件的数据库记录。

链式查询:QuerySet支持链式查询,这意味着你可以在查询中多次使用不同的方法,以便筛选和排序数据。这使得构建复杂的查询非常容易。

延迟执行:QuerySet使用延迟执行的机制,它并不立即执行数据库查询,而是在需要数据时才执行。这有助于优化查询,减少不必要的数据库访问。

更新和删除数据:你可以使用update()方法来更新QuerySet中的数据,或者使用delete()方法删除匹配条件的数据。

聚合和统计:QuerySet支持对查询结果进行聚合和统计操作,如计数、求和、平均值等。

序列化数据:你可以将QuerySet中的数据序列化为JSON或其他格式,以便在API或前端应用程序中使用。

使用模型类:QuerySet是与Django模型类相关联的,它与模型类一起工作,允许你以面向对象的方式处理数据库数据。

QuerySet其他的其接口定义,用法类似,这里不再一一赘述,需要运用,可查阅Django官网。

在这里插入图片描述

1.3 Instance功能

Instance指的是一个 Django 模型的单个实例,也就是数据库中的一行数据。相比于 QuerySet(查询集合),它是针对单个对象的操作,用于创建、更新或者删除单个模型实例。
创建一个对象:Obj = Model(attr1=val1, attr2=val2),Obj.save()
更新一个对象:Obj = Model.objects.get(id=xxx),Obj.attr1 = val1,Obj.save()
删除一个对象:Obj = Model.objects.get(id=xxx),Obj.delete()

QuerySet 适用于需要查找多个对象或进行聚合操作的场景,而 Instance 适用于单独对象的创建、修改和删除操作。

在这里插入图片描述

2. Django APIView

2.1 Teaching Order

APIView 的概念

APIview 是 Django REST Framework 提供的一个视图类。它和 Django 中的 view 类有些相似,但是又有一些不同之处。APIview 可以处理基于 HTTP 协议的请求,并返回基于内容协商的响应,它旨在提供一个易于使用且灵活的方式来构建 API 视图。

view.py

# 面向对象编程
from django.shortcuts import render
from rest_framework.decorators import api_view
from .models import *
from rest_framework.response import Response
from rest_framework.views import APIView
#### APIViewclass GetGoods(APIView):def get(self, request):data = Goods.objects.all()serializer = GoodsSerializer(instance=data, many=True)print(serializer.data)return Response(serializer.data)def post(self, request):# 从请求数据中提取字段request_data = {"category": request.data.get("Goodscategory"),"number": request.data.get("number"),"name": request.data.get("name"),"barcode": request.data.get("barcode"),"spec": request.data.get("spec"),"shelf_life_days": request.data.get("shelf_life_days"),"purchase_price": request.data.get("purchase_price"),"retail_price": request.data.get("retail_price"),"remark": request.data.get("remark"),}# 使用 create() 方法创建新的商品对象new_goods = Goods.objects.create(**request_data)# 对创建的对象进行序列化,并作为响应返回serializer = GoodsSerializer(instance=new_goods)return Response(serializer.data)# 面向对象编程class FilterGoodsCategoryAPI(APIView):# request 表示当前的请求对象# self 表示当前实例对象def get(self, request, format=None):print(request.method)return Response('ok')def post(self, request, format=None):print(request.method)return Response('ok')def put(self, request, format=None):print(request.method)return Response('ok')

url.py

from apps.erp_test.views import *urlpatterns = [path('admin/', admin.site.urls),path('filtergoodscategoryapi/', FilterGoodsCategoryAPI.as_view()),path('getgoods/', GetGoods.as_view()),
]

首先,self 表示当前实例对象,这里指的是视图类的实例对象。

request 表示当前的请求对象,包含了客户端发送的信息,例如请求头、请求体等。

pk 是 path 参数 int:pk,用于获取请求中的产品 ID。

format 表示客户端请求的响应格式,例如 JSON、XML 等。这个参数通常不需要指定,会根据客户端发送的 Accept 请求头来自动选择响应格式。如果客户端指定了响应格式,那么我们可以从请求中获取到这个参数并且做出相应的处理。

在这个方法中,我们需要通过 pk 参数获取到对应的产品数据,并将其序列化成 JSON 格式并返回给客户端。具体的实现方式可以参考序列化器文档和 Django ORM 文档。

在这里插入图片描述
  ‍

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux系统编程05

在代码中启动多个进程 使用system库函数启动多个进程 传统的进程调用就是我们在命令框里输入运行某个进程,而我们可以依靠代码,实现让一个进程取启动另一个进程 在进程运行过程我们使用命令ps -elf看到正在运行的有三个进程 system的调用过程 首先./…

基于springboot基于会员制医疗预约服务管理系统项目【项目源码+论文说明】计算机毕业设计

基于springboot基于会员制医疗预约服务管理系统演示 摘要 会员制医疗预约服务管理信息系统是针对会员制医疗预约服务管理方面必不可少的一个部分。在会员制医疗预约服务管理的整个过程中,会员制医疗预约服务管理系统担负着最重要的角色。为满足如今日益复杂的管理需…

VPN(虚拟专用网)攻略大全,你一定会用到!

你们好,我的网工朋友。 今天想和你聊聊VPN。 在VPN出现之前,企业分支之间的数据传输只能依靠现有物理网络(例如Internet)。 但由于Internet中存在多种不安全因素,报文容易被网络中的黑客窃取或篡改,最终…

​iOS上架App Store的全攻略

第一步:申请开发者账号 在开始将应用上架到App Store之前,你需要申请一个开发者账号。 1.1 打开苹果开发者中心网站:Apple Developer 1.2 使用Apple ID和密码登录(如果没有账号则需要注册),要确保使用与公…

Biotech - 环状 mRNA 的 LNP 递送系统 与 成环框架

欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://spike.blog.csdn.net/article/details/133992971 环状 RNA(或 circRNA )是一种单链 RNA,与线性 RNA 不同,形成一个共价闭合的连续环。在环…

短视频矩阵系统源码---开发

一、智能剪辑、矩阵分发、无人直播、爆款文案于一体独立应用开发 抖去推----主要针对本地生活的----移动端(小程序软件系统,目前是全国源头独立开发),开发功能大拆解分享,功能大拆解: 7大模型剪辑法(数学阶乘&#x…

系统性认知网络安全

前言:本文旨在介绍网络安全相关基础知识体系和框架 目录 一.信息安全概述 信息安全研究内容及关系 信息安全的基本要求 保密性Confidentiality: 完整性Integrity: 可用性Availability: 二.信息安全的发展 20世纪60年代&…

JavaScript基础知识16——分支语句

哈喽,大家好,我是雷工。 今天学习JavaScript基础知识的分支语句,以下为学习笔记。 1、程序三大流程控制语句 ○写几句就从上往下执行几句,这种叫做顺序结构; ○有时要根据条件选择执行代码,这种叫分支结构…

【DM8连接】DBeaver连接DM8

dm.jdbc.driver.DmDriver jdbc:dm://{host}:{port} 5236 DmJdbcDriver18.jar

linux elf relationship between data structures involved in symbol resolution

When a program imports a certain function or variable, the linker will include a string with the function or variable’s name in the .dynstr section. A symbol (Elf Sym) that refers to the function or variable’s name in the .dynsym section, and a relocati…

QT的Qporcess功能的使用

具体实现代码如下&#xff1a; #include <QProgressBar>//必须要包含的头文件 #include <QProcess>// 创建一个QProgressBar对象QProgressBar *progressBar new QProgressBar(this);QProcess *proces;process_shownew process;// 设置进度条的最小值和最大值prog…

极智嘉(Geek+)柔性货箱到人拣选方案,助力Starlinks实现高效运营

近些年&#xff0c;电商业务席卷全球&#xff0c;一众企业蓬勃发展。比如沙特阿拉伯先进的物流与供应链解决方案供应商Starlinks的电子商务的销售额从6%增长到了23%。为满足日益增长的国际电商业务需求&#xff0c;以及订单交付时效性更高的要求&#xff0c;Starlinks与全球仓储…

闭包(函数)

把内部函数通过return扔出去 必要条件

laravel 中 npm run 同时执行多个命令

在使用laravel 启动项目时 经常需要同时运行两个命令。 1.前端既是 npm run dev 2.后端php则是 php artisan serve 可以安装 使用 concurrently 进行并行启动 concurrently - npm npm install concurrently --save 之后修改 package.json 在 scripts 中增加 &#xff08;多条…

--initialize specified but the data directory has files in it. Aborting. 问题解决

当电脑输入这条命令以试图初始化数据库的时候&#xff0c;出现这样的错误。 2023-10-23T09:04:21.258180Z 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more deta…

CanIf Transmit Buffering 机制说明

目录 前言未使能场景的报文发送机制使能场景的报文发送机制如何配置前言 在AUTOSAR CanIf 中,提供了发送的Buffering机制 。对于一个报文来说,Buffering起始于CanIf_Transmit,结束于CanIf_TxConfirmation 。 主要应用与一个MailBox 发送多个报文的场景,用于解决因为硬件发…

8个卓越的矢量图插画资源网站

在插画设计中&#xff0c;如何寻找能够自由缩放的矢量图插画素材&#xff0c;一直是我们设计的难点。 下面&#xff0c;为大家推荐8个矢量图插画素材网站&#xff0c;希望能够满足同学们的设计需求。 1&#xff1a;即时设计 即时设计是可云端编辑的专业级 UI 设计工具&#…

Python学习笔记——文件操作、异常捕获、模块

食用说明&#xff1a;本笔记适用于有一定编程基础的伙伴们。希望有助于各位&#xff01; 文件读取 文件操作比较常见&#xff0c;通常我们需要对文件进行读取操作&#xff1a; f1 open(assets/Files/测试文件.txt, r, encodingUTF-8)# 辨别是否可读print(f1.readable())# 读取…

打包Qt程序,自动添加依赖的库和文件(详细步骤)

1、打开对应版本的命令面板&#xff0c;选择即可&#xff1a; 一般安装qt的时候&#xff0c;都会自带的 2、进入到编译成功的程序所在的目录&#xff1a; 输入&#xff1a;windeployqt XXX.exe&#xff08;实际的程序名字&#xff09; 这样这个程序所依赖的库都会自动添加进来…

Mysql高级——锁(2)

4. 锁的内存结构 InnoDB 存储引擎中的锁结构如下&#xff1a; 锁所在的事务信息&#xff1a; 不论是表锁还是行锁&#xff0c;都是在事务执行过程中生成的&#xff0c;哪个事务生成了这个锁结构&#xff0c;这里就记录这个事务的信息。 此锁所在的事务信息在内存结构中只是一…