本篇笔记目录索引如下:

  1. model 准备

1、model 准备

在上一篇笔记中,我们新建了一个 application,增加了几个model 同步到了数据库,这次我们新建一个名为 blog 的application,同步数据结构。

大概分为以下几步:

  • python3 manage.py startapp blog
  • 将 'blog.apps.BlogConfig’, 写入 settings.py INSTALLED_APPS
  • 更新 blog/models.py
  • python3 manage.py makemigrations blog
  • python3 manage.py migrate blog

具体执行 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

2、增

有以下几种方法(以下操作皆在 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)

3、查

查询的语法有查询之后返回 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()

4、删

如果要删除 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 数据也会被删除

5、改

批量更新:

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对数据库进行增删改查的更多相关文章

  1. django之创建第8-1个项目-数据库之增删改查/数据库数据显示在html页面

    1.为test.DB数据库预先创建下面数据 1    张三    16    2015-01-02    12    李四    17    2015-01-04    13    王五    14  ...

  2. Mybatis学习笔记(二) 之实现数据库的增删改查

    开发环境搭建 mybatis 的开发环境搭建,选择: eclipse j2ee 版本,mysql 5.1 ,jdk 1.7,mybatis3.2.0.jar包.这些软件工具均可以到各自的官方网站上下载 ...

  3. magento中Model创建以及该Model对于数据库的增删改查

    本文是按照magento英文文档照做与翻译的. Model层的实现是mvc框架的一个巨大的部分.它代表了你的应用的数据,或者说大多数应用没有数据是无用的.Magento的Model扮演着一个重要的角色 ...

  4. MySQL数据库学习笔记(十二)----开源工具DbUtils的使用(数据库的增删改查)

    [声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...

  5. [译]聊聊C#中的泛型的使用(新手勿入) Seaching TreeVIew WPF 可编辑树Ztree的使用(包括对后台数据库的增删改查) 字段和属性的区别 C# 遍历Dictionary并修改其中的Value 学习笔记——异步 程序员常说的「哈希表」是个什么鬼?

    [译]聊聊C#中的泛型的使用(新手勿入)   写在前面 今天忙里偷闲在浏览外文的时候看到一篇讲C#中泛型的使用的文章,因此加上本人的理解以及四级没过的英语水平斗胆给大伙进行了翻译,当然在翻译的过程中发 ...

  6. Java通过JDBC连接数据库的三种方式!!!并对数据库实现增删改查

    前言 java连接数据库完整流程为: 1,获得驱动(driver),数据库连接(url),用户名(username),密码(password)基本信息的三种方式. 2,通过获得的信息完成JDBC实现连 ...

  7. Django基础学习四_数据库的增删改查

    今天主要学习两个东西 1.如何对数据库做增删改查 2.如果将数据库中的数据用html的方式返回到前台 一.对数据库中增删改查操作 1.首先需要先见表,见表的方法我们在“http://www.cnblo ...

  8. 9.5Django操作数据库的增删改查

    2018-9-5 18:10:52 先贴上笔记 day61 2018-04-28 1. 内容回顾 1. HTTP协议消息的格式: 1. 请求(request) 请求方法 路径 HTTP/1.1\r\n ...

  9. Web框架之Django_02基本操作(Django项目启动配置、数据库连接、orm、增删改查)

    摘要: Django项目简单现实过程 pycharm连接数据库 Django之orm简单操作增删改查 一.新建Django项目.配置.设置: 新建Django项目:(为了熟悉Django操作,暂时全部 ...

  10. java jdbc 连接mysql数据库 实现增删改查

    好久没有写博文了,写个简单的东西热热身,分享给大家. jdbc相信大家都不陌生,只要是个搞java的,最初接触j2ee的时候都是要学习这么个东西的,谁叫程序得和数据库打交道呢!而jdbc就是和数据库打 ...

随机推荐

  1. Flink Heartbeat of TaskManager和Heartbeat of ResourceManager timed out问题

    最近上了个Flink任务,运行一段时间后就自动停止了,很是郁闷,查看最后一个chekpoint时间点,翻看时间日志 2019-12-13 07:25:24.566 flink [flink-akka. ...

  2. JAVA基础Day3-用户交互Scanner/顺序结构/选择结构/循环结构

    一.用户交互Scanner JAVA提供了一个工具类,可以用来获取用户的输入. java.util.Scanner是Java5的新特征,可以通过Scanner类来获取用户的输入. 基本语法: Scan ...

  3. MySQL 面试题总结

    MySQL的面试知识点总结 Q1:MySQL 的逻辑架构了解吗? 第一层是服务器层,主要提供连接处理.授权认证.安全等功能. 第二层实现了 MySQL 核心服务功能,包括查询解析.分析.优化.缓存以及 ...

  4. DataRow[]数组转换为DataTable

    DataRow[] drData=DataTable.Select("....."); DataTable dtNew=drData.CopyToDataTable(); 注:Da ...

  5. Springboot项目记录1配置环境

    一.电脑商城项目: 项目功能:登录,注册,热销商品,用户管理(密码,个人信息,头像,收货地址).购物车(展示.增加.删除).订单模块. 二.开发顺序: 注册.登录.用户管理.购物车.商品.订单模块 三 ...

  6. vim实用用法

    1 dd 删除1行 1 gg 跳到第一行 G 文本最后 C 删除当前光标到行尾,并进入插入模式 D 删除当前光标到行尾 dw 删除一个单词 yw 复制一个单词 r /PATH/FROM/SOMEFIL ...

  7. java获取当前类的绝对路径

    转自: http://blog.csdn.net/elina_1992/article/details/47419097   1.如何获得当前文件路径 常用: (1).Test.class.getRe ...

  8. MarkDown使用规范

    写博客的简单语法. 标题语法 一级标题:# 标题内容 二级标题:## +标题内容 三级标题:### +标题内容 后续标题语法依次增加# 注:#号后有空格 MarkDown最高支持六级标题. 字体语法 ...

  9. MySQL代替in之临时表

    如果我们正常的使用IN去查询 SELECT * FROM a JOIN b ON a.id = b.id WHERE b.tag_id IN (1,2,3,4,5,6) 这种因为in里面的参数是连续的 ...

  10. win10edge浏览器个人账户退出登录后再次登录自动登录问题

    edge浏览器退出登录后,再次点击登录以同步数据会自动登录,可查看书签等个人数据 解决方法: 先在浏览器里面退出账户. 1.设置--电子邮件和账户--管理 2.登录后--安全--安全仪表板--高级安全 ...