- Java锁的逻辑(结合对象头和ObjectMonitor)
- 还在用饼状图?来瞧瞧这些炫酷的百分比可视化新图形(附代码实现)⛵
- 自动注册实体类到EntityFrameworkCore上下文,并适配ABP及ABPVNext
- 基于Sklearn机器学习代码实战
本篇笔记目录索引如下:
在上一篇笔记中,我们新建了一个 application,增加了几个model 同步到了数据库,这次我们新建一个名为 blog 的application,同步数据结构。 大概分为以下几步:
具体执行 migrate 的操作步骤,可以参见上一篇笔记.
blog/models.py 的具体内容如下:
# blog/models.py
from django.db import models
class Blog(models.Model):
name = models.CharField(max_length=100)
tagline = models.TextField()
def __str__(self):
return self.name
class Author(models.Model):
name = models.CharField(max_length=200)
email = models.EmailField()
def __str__(self):
return self.name
class Entry(models.Model):
blog = models.ForeignKey(Blog, on_delete=models.CASCADE)
headline = models.CharField(max_length=255)
body_text = models.TextField()
pub_date = models.DateField()
mod_date = models.DateField()
authors = models.ManyToManyField(Author)
number_of_comments = models.IntegerField()
number_of_pingbacks = models.IntegerField()
rating = models.IntegerField()
def __str__(self):
return self.headline
有以下几种方法(以下操作皆在 python3 manage.py shell 环境中进行):
实例化,然后save() 保存 。
from blog.models import Blog
b = Blog(name='Beatles Blog', tagline='All the latest Beatles news.')
b.save()
当执行 save() 操作之后,数据就会创建到数据库,因为主键 id 为自动增长的,所以id会自动赋值.
当然也可以先实例化一个空的 Blog,然后再赋值:
from blog.models import Blog
b = Blog()
b.name = 'hunter'
b.tagline = 'tag lines'
b.save()
save 之后,如果需要修改 name 的值,可以直接进行修改:
b.name = ‘python’
b.save()
使用 create() 方法创建 。
from blog.models import Blog
b = Blog.objects.create(name='hunter', tagline='tagline')
调用 create() 方法,会返回这条数据保存后的对象.
批量创建 如果要批量创建数据,用上面的方法大概的就是在一个循环里,挨个去实例化一个 Blog,然后执行 save() 操作.
但Django 提供了一个 bulk_create() 的方法,可以提高这个效率,使用示例如下:
from blog.models import Blog
blog_1 = Blog(name='hunter1', tagline='tagline1')
blog_2 = Blog(name='hunter2', tagline='tagline2')
blog_obj_list = [blog_1, blog_2]
Blog.objects.bulk(blog_obj_list)
查询的语法有查询之后返回 QuerySet 的查询,比如 filter(),exclude() 也有 返回单个 object 的查询,比如 get() 。
对于 QuerySet,这个我们可以简单理解为是多个 object 实例形成的列表,但是这个列表是Django的一种特有的形式,具有能进行其他条件筛选的功能.
接下来简单介绍一下查询的功能: filter(),过滤筛选,返回的是符合条件的数据 比如我们要搜索 Entry 表里,name 的值为 hunter 的数据,使用如下:
Entry.objects.filter(name='hunter')
exclude(),排除筛选,返回的是不符合条件的数据 比如我们要搜索 Entry 表里,name 的值不为 hunter 的数据:
Entry.objects.exclude(name='hunter')
链式查询: Django 支持 链式查询,可以多个 filter 或者 exclude 条件累加,取的是 AND 的逻辑:
Entry.objects.filter(name='hunter').exclude(name='paul').filter(id=1)
懒加载: Django 的查询有一个机制叫做懒加载,意思是只有当你真正需要去取数据的时候 系统才会去数据库获取数据,官方例子如下:
>>> q = Entry.objects.filter(headline__startswith="What")
>>> q = q.filter(pub_date__lte=datetime.date.today())
>>> q = q.exclude(body_text__icontains="food")
>>> print(q)
上述语句虽然看起来查询了三次数据库,但实际上只有最后 print(q) 的时候才去访问了数据库.
get() 前面讲的 filter 和 exclude 返回的都是 QuerySet,简单来说就是多个 object 形成的列表,而 get() 操作返回的直接是一条符合条件的 object。 比如:
blog = Blog.objects.get(id=1)
注意: get() 方法需要慎用,因为查询的条件在数据库里,有多条或者一条都没有的时候系统会报错。 get() 的查询一般仅用在我们能够确定 在数据库里 有且仅有 一条数据情况下.
对QuerySe进行切片 用 filter 对数据进行操作的时候,如果需要对数据的返回数量进行限制,需要用到 python 里的切片。 PS :数量的返回限制对应于 mysql 里的 limit 用法。 比如:
blog_list = Blog.objects.all()[1:5]
但是和 python 里的切片不一样的时候,Django 的查询不支持 负数查询,比如下面的操作是不被允许的:
Blog.objects.all()[-1] # error
Blog.objects.all()[-1: 3] # error
字段条件查找: 在我们使用 mysql 的时候 where 后面会跟一些查询的限制条件,在Django 里用 双下划线来实现 比如 id 的值大于 5 。
Model.objects.filter(id__gt=5)
大于:gt 大于等于:gte 小于:lt 小于等于:lte 包含:in 是否为 null :isnull 。
精确查找: 精确查找使用 exact,一般查询的时候 后面不加上面的字段条件,都属于精确查找,不过默认是将 exact 字段省略。 比如,下面两条代码是一致的:
Blog.objects.get(id__exact=14)
Blog.objects.get(id=14)
查询外键关联数据 比如 Entry 这个 model 的外键是 Blog,我们想通过 查找 Blog 的 name 字段为 Hunter 的Entry 数据:
Entry.objects.filter(blog__name='Hunter')
如果你想反向搜索也是可以的,将 model 名称小写即可:
Blog.objects.filter(entry__headline='abc')
计算查找 在Django 中引用字段来进行比较,比如我们想实现如下功能:
select * from blog_entry where number_of_comments > number_of_pingbacks;
可以使用Django 中的 F,它的作用是 取值,取出其中的字段值,那么上述例子可以用 Django来实现可以是:
from django.db.models import F
Entry.objects.filter(number_of_comments__gt=F(“number_of_pinbbacks"))
还可以在使用中对 F() 进行一系列的操作:
Entry.objects.filter(number_of_comments__gt=F('number_of_pingbacks') * 2)
Entry.objects.filter(rating__lt=F('number_of_comments') + F('number_of_pingbacks'))
pk 使用方法 pk 意思是 primary key ,主键,可以直接使用 pk 来搜索,但在项目中一般是使用 id 作为主键,所以一般是等价于id的用法:
Blog.objects.filter(pk__gt=11)
Q 查询: 我们知道可以使用 filter 来进行 链式查询,那个逻辑是一个且的逻辑,那么 或 的逻辑应该如何处理呢 我们可以使用Q() 来实现 。
我们可以使用 Q() 来将一个个的条件 串起来,比如,我们想筛选 Blog 中 id= 3 或者 id = 4 的数据可以使用如下:
Blog.objects.filter(Q(id=3) | Q(id=4))
也可以实现 且 的功能Q() & Q() 取反:~Q() 。
如果要删除 objects,有两种方法,一种先获取 object,然后 delete() 。
blog = Blog.objects.get(id=1)
blog.delete()
或者通过 filter 来 批量删除:
Blog.objects.filter(id__gte=10).delete()
注意: 如果有外键关联了 Blog,且 on_delete关系设置为 models.CASCADE, 那么删除相应的 Blog 的时候,对应的 关联的 Entry 数据也会被删除 。
批量更新:
Blog.objects.filter(id__gte=200).update(name='hunter')
单个更新:
blog = Blog.objects.get(id=1)
blog.name = ‘hunter’
blog.save()
以上就是我们这一篇笔记的全部内容,下一篇笔记将详细介绍Django model里的 各个字段类型以及字段属性值.
本文首发于本人微信公众号:Django笔记.
原文链接: Django笔记三之使用model对数据库进行增删改查 。
如果想获取更多相关文章,可扫码关注阅读:
最后此篇关于Django笔记三之使用model对数据库进行增删改查的文章就讲到这里了,如果你想了解更多关于Django笔记三之使用model对数据库进行增删改查的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
OkHttp的作用 OkHttp is an HTTP client。 如果是HTTP的方式想得到数据,就需要我们在页面上输入网址,如果网址没有问题,就有可能返回对应的String字符串,如果这个地址
Record 一个重要的字符串算法,这是第三次复习。 通过总结我认为之所以某个算法总是忘记,是因为大脑始终没有认可这种算法的逻辑(也就是脑回路)。 本篇主要讲解从KMP的应用场景,
SQL 注入基础 【若本文有问题请指正】 有回显 回显正常 基本步骤 1. 判断注入类型 数字型 or 字符型 数字型【示例】:
标签: #Prompt #LLM 创建时间:2023-04-28 17:05:45 链接: 课程(含JupyterNotebook) , 中文版 讲师: An
Swift是供iOS和OS X应用编程的新编程语言,基于C和Objective-C,而却没有C的一些兼容约束。Swift采用了安全的编程模式和添加现代的功能来是的编程更加简单、灵活和有趣。界面则基于
红日靶机(一)笔记 概述 域渗透靶机,可以练习对域渗透的一些知识,主要还是要熟悉 powershell 语法,powershell 往往比 cmd 的命令行更加强大,而很多渗透开源的脚本都是 po
八大绩效域详细解析 18.1 干系人绩效域 跟干系人所有相关的活动. 一、预期目标 ①与干系人建立高效的工作关系 ②干系人认同项目目标 ③支持项目的干系人提高
18.3 开发方法和生命周期绩效域 跟开发方法,项目交付节奏和生命周期相关的活动和职能. 一、预期目标: ①开发方法与项目可交付物相符合; ②将项目交付与干系人价值紧密
18.7 度量绩效域 度量绩效域涉及评估项目绩效和采取应对措施相关的活动和职能度量是评估项目绩效,并采取适当的应对措施,以保持最佳项目绩效的过程。 一、 预期目标: ①对项目状况
pygraphviz 安装,windows系统: 正确的安装姿势: Prebuilt-Binaries/PyGraphviz at master · CristiFati/Prebuilt-Binar
今天给大家介绍IDEA开发工具如何配置devtools热加载工具。 1、devtools原理介绍 spring-boot-devtools是spring为开发者提供的热加载
一 什么是正则表达式 // 正则表达式(regular expression)是一个描述字符模式的对象; // JS定义RegExp类表示正则表达式; // String和RegExp都定义了使用
目前是2022-04-25 23:48:03,此篇博文分享到互联网上估计是1-2个月后的事了,此时的OpenCV3最新版是3.4.16 这里前提是gcc,g++,cmake都需要安装好。 没安装好的,
一、概述 1、Flink 是什么 Apache Flink is a framework and distributed processing engine for stateful comput
一、window 概述 Flink 通常处理流式、无限数据集的计算引擎,窗口是一种把无限流式数据集切割成有限的数据集进行计算。window窗口在Flink中极其重要。 二、window 类型 w
一、触发器(Trigger) 1.1、案例一 利用global window + trigger 计算单词出现三次统计一次(有点像CountWindow) 某台虚拟机或者mac 终端输入:nc -
一、时间语义 在Flink 中涉及到三个重要时间概念:EventTime、IngestionTime、ProcessingTime。 1.1、EventTime EventTime 表示日志事
一、概述 以wordcount为例,为什么每次输入数据,flink都能统计每个单词的总数呢?我们都没有显示保存每个单词的状态值,但是每来一条数据,都能计算单词的总数。事实上,flink在底层维护了每
一、概述 checkpoint机制是Flink可靠性的基石,可以保证Flink集群在某个算子因为某些原因(如 异常退出)出现故障时,能够将整个应用流图的状态恢复到故障之前的某一状态,保 证应用流图状
一、standalone 部署模式 1、下载安装包 下载安装包地址 有两种安装包类型: 第一种是带 Hadoop依赖的(整合YARN) 第二种是不带 Hadoop依赖的(Standalone模式)
我是一名优秀的程序员,十分优秀!