Django 模型操作(六)

       Django通过Model操作数据库, 不管你数据库的类型是MySql或者Sqlite, Django自动帮你生成相应数据库类型的SQL语句,所以不需要关注SQL语句和类型,对数据的操作Django帮我们自动完成。只要会写Model就可以了。
    django使用对象关系映射 (Object Relational Mapping, 简称ORM)框架去操控数据库。
    ORM(Object Relational Mapping)对象关系映射, 是一种程序技术, 用于实现面向对象编程语言里不同类型系统的数据之间的转换。

一、模型

from django.db import models

# Create your models here.
class StudentModel(models.Model):
    name=models.CharField(max_length=20,unique=True) #唯一的
    age=models.PositiveIntegerField(default=18)

    class Meta:
        db_table='student'
        verbose_name='学生'
        verbose_name_plural=verbose_name

    #重写字符串
    def __str__(self):
        return f'{self.name},{self.age}'

    #重写替换
    def __repr__(self):
        return f'{self.name},{self.age}'

  

 

二、CRUD的操作

 (1) 添加有4种方式

from django.shortcuts import render
from django.http import HttpResponse
# Create your views here.

# 添加数据
from User.models import StudentModel


# 第一种方式
def save_stu(request):
    # 处理异常
    try:
        # 创建对象
        stu = StudentModel()
        # 给属性赋值
        stu.name = '刘芳'
        stu.age = 20
        # 保存数据(同步到数据库中)
        stu.save()
    except Exception as ex:
        return HttpResponse('添加失败!')

    # 返回
    return HttpResponse('添加成功!')


# 第二种方式:
def save_stu2(request):
    # 处理异常
    try:
        # 创建对象
        stu = StudentModel(name='张三', age=19)
        # 保存数据(同步到数据库中)
        stu.save()
    except Exception as ex:
        return HttpResponse('添加失败!')

    # 返回
    return HttpResponse('添加成功!')


# 第三种方式:
def save_stu3(request):
    # 处理异常
    try:
        # 创建对象
        StudentModel.objects.create(name='王涵', age=30)
    except Exception as ex:
        return HttpResponse('添加失败!')

    # 返回
    return HttpResponse('添加成功!')


# 第四种方式:
def save_stu4(request):
    # 处理异常
    try:
        # 创建对象,并返回
        stu = StudentModel.objects.get_or_create(name='芬芳', age=21)
        print('stu=', stu)
    except Exception as ex:
        return HttpResponse('添加失败!')

    # 返回
    return HttpResponse('添加成功!')


# 第五种方式:批量添加
def save_stu5(request):
    # 处理异常
    try:
        for i in range(5, 15):
            # 创建对象
            stu = StudentModel.objects.create(name=f'boy{i}', age=f'{i}')
    except Exception as ex:
        return HttpResponse('添加失败!')

    # 返回
    return HttpResponse('添加成功!')

说明:使用create方法是最常用的,第五种是批量添加数据

(2)删除数据(1条或多条)

# 删除一条数据
# (1) 先找到删除的数据
# (2) 再删除数据
def del_stu(request):
    # 处理异常
    try:
        # 创建对象
        stu = StudentModel.objects.first()  # 删除第一条数据
        stu.delete()  # 删除
    except Exception as ex:
        return HttpResponse('删除失败!')
    # 返回
    return HttpResponse('删除成功!')


# 删除多条数据
# (1) 先找到删除的数据
# (2) 再删除数据
def del_stu2(request):
    # 处理异常
    try:
        StudentModel.objects.filter(age__gte=20).delete()  # 删除多条条件
    except Exception as ex:
        return HttpResponse('删除失败!')
    # 返回
    return HttpResponse('删除成功!')

 (3) 修改数据 (1条或多条)

  模型没有定义update方法, 直接给字段赋值, 并调用save, 能实现update的功能, 比如:
        obj = StudentModel.objects.get(id=2)
        obj.name = 'liu'
        obj.save()
    save更新时会更新所有字段。如果只想更新某个字段, 减少数据库操作, 可以这么做:
        obj.name = 'john'
        obj.save(update_fields=['name'])
 

# 更新一条数据
# (1) 先找到这条数据
# (2) 再修改数据
def update_stu(request):
    # 处理异常
    try:
        # 创建对象
        stu = StudentModel.objects.first()  # 第一条
        stu.name = 'mike'
        stu.age = 22
        # 保存到数据库中
        stu.save()
    except Exception as ex:
        return HttpResponse('更新失败!')
    # 返回
    return HttpResponse('更新成功!')


# 更新1条数据
# (1) 先找到这条数据
# (2) 再修改数据
def update_stu2(request):
    # 处理异常
    try:
        # 创建对象
        stu = StudentModel.objects.get(id=18)  # 根据id条件
        stu.name = 'john'
        stu.age = 20
        # 保存到数据库中
        stu.save()
    except Exception as ex:
        return HttpResponse('更新失败!')
    # 返回
    return HttpResponse('更新成功!')


# 更新多条数据
# (1) 先找到这条数据
# (2) 再修改数据
def update_stu3(request):
    # 处理异常
    try:
        # 创建对象
        StudentModel.objects.all().update(age=25)  # 所有数据更新年龄为25
    except Exception as ex:
        return HttpResponse('更新失败!')
    # 返回
    return HttpResponse('更新成功!')

 (4)查询数据

   get(): 获取单条数据:
        StudentModel.objects.get(id=100)
        如果没有找到符合条件的对象, 会引发模型类.DoesNotExist异常
        如果找到多个, 会引发模型类.MultipleObjectsReturned异常
    first(): 返回查询集(QuerySet)中的第一个对象
    last(): 返回查询集中的最后一个对象
    count(): 返回当前查询集中的对象个数
    exists(); 判断查询集中是否有数据, 如果有数据返回True没有反之False
    all(): 获取全部数据: StudentModel.objects.all()

# 查询操作
def get_stu(request):
    # (1) get():获得一条数据
    stu = StudentModel.objects.get(id=18)

    # first; 第一条数据
    # stu = StudentModel.objects.first()

    # last; 最后一条数据
    # stu = StudentModel.objects.last()

    # 打印
    print(stu, type(stu))
    print(stu.name, stu.age)

    # 返回
    return HttpResponse('查询成功!')


def get_stu2(request):
    # (2) all():获得所有数据
    stu = StudentModel.objects.all()
    # 打印
    print(stu, type(stu))
    for st in stu:
        print(st.name, st.age)
    # 返回
    return HttpResponse('查询成功!')

查询 filter()过滤详解

def get_stu3(request):
    # (3) filter(): 过滤数据,(常使用)
    # stu=StudentModel.objects.filter()  #默认没有条件,就是获取所有的数据
    # stu=StudentModel.objects.filter(age__lte=26)  #有条件,age<=26,就是获取条件数据
    # stu=StudentModel.objects.filter(age__gte=26)  #有条件,age>=26,就是获取条件数据
    # stu=StudentModel.objects.filter(age__gt=26)  #有条件,age>26,就是获取条件数据
    # stu=StudentModel.objects.filter(age__lt=26)  #有条件,age<26,就是获取条件数据
    # 打印
    # print(stu, type(stu))
    # for st in stu:
    #     print(st.name, st.age)

    # 如果使用的对象是返回结果集的对象可以链接是使用的
    # print(stu.filter().filter().all().filter())
    # 注意:在使用链接对象一个对象如果是返回单个对象就表示链接结束
    # print(stu.filter().filter().get())

    # 显示调用中
    # print(stu.get())
    # print(stu.first())
    # print(stu.last())
    # 查询集是否存在数据如果存在数据为True,否则为False
    # print(stu.exists())
    # print(stu.all())
    # 查询数据中的个数
    # print(stu.count())

    # values方法和valeus_list()方法
    stus = StudentModel.objects.filter()
    # 查询原数据
    print(stus)
    # 查询的结果集强制转换成列表
    print(list(stus))

    # 列表套字典
    print(stus.values())
    # 列表套字典(这个是是字段名)
    print(stus.values('name', 'age'))

    # 列表套元组(只有值)
    print(stus.values_list())
    # 列表套元组(这个是是字段名)
    print(stus.values_list('name', 'age'))

    # 返回
    return HttpResponse('查询成功!')


# filter详讲,类似于sql的where条件
def get_stu4(request):
    # in
    # stus = StudentModel.objects.filter(age__in=[16,18,21])
    # not in 取反
    # stus = StudentModel.objects.exclude(age__in=[16,18,21])

    # like 模糊查询
    # stus = StudentModel.objects.filter(name__contains='y1')

    # 正则表达式 匹配m开头 ,区分大小写
    # stus = StudentModel.objects.filter(name__regex='^m')
    # 不区分大小写
    # stus = StudentModel.objects.filter(name__iregex='^M')

    # range 在16-21之间范围
    # stus = StudentModel.objects.filter(age__range=[16, 21])
    # 以b开头,不区分大小写
    # stus = StudentModel.objects.filter(name__startswith='m')
    stus = StudentModel.objects.filter(name__istartswith='m')
    # 以n结尾,不区分大小写
    # stus = StudentModel.objects.filter(name__endswith='n')
    # stus = StudentModel.objects.filter(name__iendswith='n')

    print(stus)

    # 返回
    return HttpResponse('查询成功!')

 聚合函数

导包  from django.db.models import Max,Avg,Min,Sum,Count 

使用aggregate()函数返回聚合函数的值
        Avg: 平均值
        Count: 数量
        Max: 最大
        Min: 最小
        Sum: 求和

#聚合函数: max,min,sum,avg,count
def get_stu5(request):
    from django.db.models import Max,Avg,Min,Sum,Count
    # stus = StudentModel.objects.aggregate(Max('age'))
    # stus = StudentModel.objects.aggregate(Avg('age'))
    # stus = StudentModel.objects.aggregate(Sum('age'))
    # stus = StudentModel.objects.aggregate(Min('age'))
    stus = StudentModel.objects.aggregate(Count('age'))
    print(stus)

    # 返回
    return HttpResponse('查询成功!')

排序(升序,降序)

升序:order_by('字段名')   默认

降序:order_by('-字段名')

#排序: 升序,降序
def get_stu6(request):
    #ASC 1个字段
    stus = StudentModel.objects.all().order_by('age')
    #ASC 两个字段
    # stus = StudentModel.objects.all().order_by('age','id')
    #DESC
    # stus = StudentModel.objects.all().order_by('-age')
    print(stus)

    # 返回
    return HttpResponse('查询成功!')

 数据表

 

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

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

相关文章

Flink State 状态原理解析 | 京东物流技术团队

一、Flink State 概念 State 用于记录 Flink 应用在运行过程中&#xff0c;算子的中间计算结果或者元数据信息。运行中的 Flink 应用如果需要上次计算结果进行处理的&#xff0c;则需要使用状态存储中间计算结果。如 Join、窗口聚合场景。 Flink 应用运行中会保存状态信息到 …

清新脱俗的Notes主页

大家好&#xff0c;才是真的好。 作为Notes客户端重度用户&#xff0c;我个人非常喜欢Notes客户机&#xff0c;平时都在使用。对于另一些Notes用户&#xff0c;喜欢Notes的人非常喜欢&#xff0c;而且还知道它非常强大&#xff0c;可以进行很多定制化。 今天我们来讲的就是No…

【MATLAB】SSA+FFT+HHT组合算法

有意向获取代码&#xff0c;请转文末观看代码获取方式~也可转原文链接获取~ 1 基本定义 SSAFFTHHT组合算法是一种基于奇异谱分析&#xff08;SSA&#xff09;、快速傅里叶变换&#xff08;FFT&#xff09;和希尔伯特-黄变换&#xff08;HHT&#xff09;的组合算法。 其中&am…

【CentOS8】使用 Tomcat 部署 Java Web 项目(使用 sdkman)

文章目录 配置 Tomcat将 Tomcat 启动命令设置为 Linux 自定义服务给 Tomcat 设置管理员账号密码IDEA 打包 Java web 项目 我是使用 sdkman 下载的 jdk 和 tomcat&#xff0c;所以接下来的部署配置都是在 sdkman 构建的环境的。想要知道如何下载 sdkman 可以看看这篇文章 —…

操作符(原码反码补码)

目录 前言&#xff1a; 原反补码&#xff1a; 位操作符&#xff1a; &#xff06; &#xff5c; &#xff3e; &#xff5e; >> << 总结&#xff1a; 逻辑操作符 && || 其他操作符&#xff1a; sizeof -- () &#xff1f;&#xf…

数据仓库与数据挖掘复习资料

一、题型与考点[第一种] 1、解释基本概念(中英互译解释简单的含义)&#xff1b; 2、简答题(每个10分有两个一定要记住)&#xff1a; ① 考时间序列Time series(第六章)的基本概念含义解释作用&#xff08;序列模式挖掘的作用&#xff09;&#xff1b; ② 考聚类(第五章)重点考…

Redis7--基础篇7(哨兵sentinel)

1. 关于哨兵的介绍 1、监控redis运行状态&#xff0c;包括master和slave&#xff08;主从监控&#xff09; 2、哨兵可以将故障转移的结果发送给客户端&#xff08;消息通知&#xff09; 3、当master down机&#xff0c;能自动将slave切换成新master&#xff08;故障转移&#…

STM32——电动车报警器

项目设计 // 如果检测到 PA4 被拉低&#xff08;小偷偷车&#xff09;&#xff0c;并且警报模式打开 // 则将 PB7 拉低&#xff0c;继电器通电&#xff0c;喇叭一直响 // 如果检测到 PA5 被拉高&#xff08;按键 A 按下&#xff09;&#xff0c;设定为开启警报模式 // 则将…

Python计算方差

方差可以反应变量的离散程度&#xff0c;是因为它度量了数据点与均值的差异。方差是每个数据点与均值的差的平方和的平均值&#xff0c;它可以反映数据点在均值附近的分布情况。如果方差较小&#xff0c;说明数据点更加集中在均值附近&#xff0c;离散程度较小&#xff1b;如果…

什么是神经网络的超参数

1 引言 超参数在神经网络的设计和训练中起着至关重要的作用。它们是在开始训练之前设置的参数&#xff0c;与网络的结构、训练过程和优化算法有关。正确的超参数选择对于达到最优模型性能至关重要。 2 神经网络结构的超参数 层数&#xff08;Layers&#xff09;&#xff1a; 决…

基于STM32 IAP技术的物联网设备固件更新应用研究

本文将深入研究基于STM32 IAP技术的物联网设备固件更新应用。首先&#xff0c;我们会介绍物联网设备固件更新的重要性和挑战。然后&#xff0c;我们将详细讲解STM32 IAP技术的原理和实现方式。接下来&#xff0c;我们会通过一个代码示例演示如何使用STM32 IAP技术实现物联网设备…

搭建个人网盘应用Nextcloud

使用DNF管理软件包 1 使用winscp工具将openeuler-20.03-LTS-x86_64-dvd.iso上传至openeuler虚拟机的/root目录下&#xff0c;然后执行如下命令挂载ISO [rootopenEuler ~]# mount -o loop /root/openEuler-20.03-LTS-everything-x86_64-dvd.iso /mnt/2 添加软件源 [rootope…

联合基于信息论的安全和隐蔽通信的框架

这个标题很帅 abstractintroductionsystem modelPROPOSED JOINT OPTIMIZATION OF ITS AND COVERT TRANSMISSION RATE信息论安全 &#xff08;ITS&#xff09;隐蔽通信需要&#xff08;CC&#xff09; Joint Information-Theoretic Secrecy and Covert Communication in the Pre…

AWS Remote Control ( Wi-Fi ) on i.MX RT1060 EVK - 2 “架构 AWS”

接续上一章节&#xff0c;我们把开发环境架设好之后&#xff0c;此章节叙述如何建立 AWS IoT 环境&#xff0c;请务必已经有 AWS Account&#xff0c;申请 AWS Account 之流程将不在此说明。 III-1. 登入AWS IoT&#xff0c; 在“管理”>“所有装置”>“实物”下点击“建…

VS2019 下配置 OpenCV4.6.0 库

一、编辑电脑系统环境变量。 二、打开 VS2019 新建一个C项目。 1.进行Debug和Release的配置 X64 平台。 2.属性配置&#xff1a;VC目录 -> 包含目录 3.属性配置&#xff1a;VC目录 -> 库目录 4.属性配置&#xff1a;链接器 -> 输入 -> 附加依赖项 带 d 的 .lib 为 …

Web开发学习HTTP协议、通过浏览器控制台学习HTTP协议。

文章目录 HTTP协议1.HTTP协议是什么&#xff1f;2.HTTP协议的特点3.什么是URL?4.通过浏览器控制台学习HTTP协议Request Headers请求数据格式说明Response Headers请求数据格式说明 5.HTTP工作原理 HTTP协议 1.HTTP协议是什么&#xff1f; HTTP协议是一种超文本传输协议&…

合并PDF(将多个pdf文件整合成一个pdf文件)

推荐使用下面这个免费在线的PDF文件合并工具&#xff0c;简单且易操作。 合并PDF - 在线上免费合并PDF文件 (smallpdf.com) 还有其他功能&#xff0c;不过现在我尚未使用其他功能&#xff1a; 关于费用&#xff1a;

Python 云服务器应用,Https,定时重启

Python 云服务器应用,Https,定时重启 环境搭建Python模块模块导入生成Flask实例GET处理启动服务器打开网页验证 GET接入证书 支持https申请证书下载证书保留 xxx.crt 和 xxx.key文件就可以了 copy到python项目目录ssl_context 配置 宝塔面板操作在www目录下新建python工作目录在…

Python实现FA萤火虫优化算法优化LightGBM回归模型(LGBMRegressor算法)项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 萤火虫算法&#xff08;Fire-fly algorithm&#xff0c;FA&#xff09;由剑桥大学Yang于2009年提出 , …

【力扣】240.搜索二维矩阵

题目意思是从该矩阵之中查找出是否有和target一样的值&#xff0c;若有则返回true&#xff0c;无则返回false。这里我用的是java。总共有三种方法&#xff0c;分别是暴力解题法&#xff08;能过&#xff09;&#xff0c;二分查找法&#xff08;就是将二维数组拆分成m个二维数组…