django强悍的数据库接口(QuerySet API)

  • 4种方法插入数据
  • 获取某个对象
  • filter过滤符合条件的对象
  • filter过滤排除某条件的对象- 支持链式多重查询

没找到排序的

- 4种方法插入数据
1.
Person.obejct.create(name="maotai",age = 22) 2.
p = Person(name = "percona", age = 28)
p.save() 3.
p = Person()
p.name = "tutu"
p.age = 21
p.save() 4.不存在则创建,存在则获取
Person.objects.get_or_create(name='percona',age = 29) - 获取某个对象
- 获取所有 Person.objects.all()
- 获取前10个,切片操作, Person.objects.all()[:10]
- 指定某字段: Person.objects.get(name=name) - filter过滤符合条件的对象
- name严格等于maotai的, Person.objects.filter(name="maotai") 或
Person.objects.filter(name__exact="maotai")
- name等于maotai的,含大小写 Person.objects.filter(name__iexact="maotai")
- name包含abc的人 Person.objects.filter(name__contains="abc")
- name包含abc的人,含大小写 Person.objects.filter(name__icontains="abc")
- 正则匹配 Person.objects.filter(name__regex="^abc")
- 正则匹配,含大小写 Person.objects.filter(name__iregex="^abc") - filter过滤排除某条件的对象- 支持链式多重查询
- 排除包含maotai的Person对象 Person.objects.exclude(name__contains="maotai")
- 找出名称含有abc, 但是排除年龄是23岁的 Person.objects.filter(name__contains="abc").exclude(age=23)

QuerySet 增删改查

数据库查询出来的结果是QuerySet,可按照list方法来操作

1.QuerySet 创建对象的方法

>>> from blog.models import Blog
>>> b = Blog(name='Beatles Blog', tagline='All the latest Beatles news.')
>>> b.save() 总之,一共有四种方法
# 方法 1
Author.objects.create(name="maotai", email="maotai@163.com") # 方法 2
twz = Author(name="maotai", email="maotai@163.com")
twz.save() # 方法 3
twz = Author()
twz.name="maotai"
twz.email="maotai@163.com"
twz.save() # 方法 4,首先尝试获取,不存在就创建,可以防止重复
Author.objects.get_or_create(name="maotai", email="maotai@163.com")
# 返回值(object, True/False)

备注:前三种方法返回的都是对应的 object,最后一种方法返回的是一个元组,(object, True/False),创建时返回 True, 已经存在时返回 False

当有一对多,多对一,或者多对多的关系的时候,先把相关的对象查询出来

>>> from blog.models import Entry
>>> entry = Entry.objects.get(pk=1)
>>> cheese_blog = Blog.objects.get(name="Cheddar Talk")
>>> entry.blog = cheese_blog
>>> entry.save()

2.获取对象的方法(上一篇的部分代码)

Person.objects.all() # 查询所有
Person.objects.all()[:10] 切片操作,获取10个人,不支持负索引,切片可以节约内存,不支持负索引,后面有相应解决办法,第7条
Person.objects.get(name="maotai") # 名称为 maotai 的一条,多条会报错 get是用来获取一个对象的,如果需要获取满足条件的一些人,就要用到filter
Person.objects.filter(name="abc") # 等于Person.objects.filter(name__exact="abc") 名称严格等于 "abc" 的人
Person.objects.filter(name__iexact="abc") # 名称为 abc 但是不区分大小写,可以找到 ABC, Abc, aBC,这些都符合条件 Person.objects.filter(name__contains="abc") # 名称中包含 "abc"的人
Person.objects.filter(name__icontains="abc") #名称中包含 "abc",且abc不区分大小写 Person.objects.filter(name__regex="^abc") # 正则表达式查询
Person.objects.filter(name__iregex="^abc")# 正则表达式不区分大小写 # filter是找出满足条件的,当然也有排除符合某条件的
Person.objects.exclude(name__contains="WZ") # 排除包含 WZ 的Person对象
Person.objects.filter(name__contains="abc").exclude(age=23) # 找出名称含有abc, 但是排除年龄是23岁的

3.删除符合条件的结果

Person.objects.filter(name__contains="abc").delete() # 删除 名称中包含 "abc"的人

如果写成
people = Person.objects.filter(name__contains="abc")
people.delete()
效果也是一样的,Django实际只执行一条 SQL 语句。

4.更新某个内容

(1) 批量更新,适用于 .all()  .filter()  .exclude() 等后面 (危险操作,正式场合操作务必谨慎)

Person.objects.filter(name__contains="abc").update(name='xxx') # 名称中包含 "abc"的人 都改成 xxx
Person.objects.all().delete() # 删除所有 Person 记录 (2) 单个 object 更新,适合于 .get(), get_or_create(), update_or_create() 等得到的 obj,和新建很类似。
twz = Author.objects.get(name="maotai")
twz.name="maotai"
twz.email="maotai@163.com"
twz.save() # 最后不要忘了保存!!!

5.QuerySet 是可迭代的

es = Entry.objects.all()
for e in es:
print(e.headline)

注意事项:

- (1). 如果只是检查 Entry 中是否有对象,应该用 Entry.objects.all().exists()
- (2). QuerySet 支持切片 Entry.objects.all()[:10] 取出10条,可以节省内存
- (3). 用 len(es) 可以得到Entry的数量,但是推荐用 Entry.objects.count()来查询数量,后者用的是SQL:SELECT COUNT(*)
- (4). list(es) 可以强行将 QuerySet 变成 列表

6. QuerySet 是可以用pickle序列化到硬盘再读取出来的

>>> import pickle
>>> query = pickle.loads(s) # Assuming 's' is the pickled string.
>>> qs = MyModel.objects.all()
>>> qs.query = query # Restore the original 'query'.

7. QuerySet 查询结果排序

Author.objects.all().order_by('name')
Author.objects.all().order_by('-name') # 在 column name 前加一个负号,可以实现倒序

8. QuerySet 支持链式查询

Author.objects.filter(name__contains="maotai").filter(email="maotai@163.com")
Author.objects.filter(name__contains="Wei").exclude(email="maotai@163.com") # 找出名称含有abc, 但是排除年龄是23岁的
Person.objects.filter(name__contains="abc").exclude(age=23)

9. QuerySet 不支持负索引

Person.objects.all()[:10] 切片操作,前10条
Person.objects.all()[-10:] 会报错!!! # 1. 使用 reverse() 解决
Person.objects.all().reverse()[:2] # 最后两条
Person.objects.all().reverse()[0] # 最后一条 # 2. 使用 order_by,在栏目名(column name)前加一个负号
Author.objects.order_by('-id')[:20] # id最大的20条

10. QuerySet 重复的问题,使用 .distinct() 去重

一般的情况下,QuerySet 中不会出来重复的,重复是很罕见的,但是当跨越多张表进行检索后,结果并到一起,可能会出来重复的值(我最近就遇到过这样的问题)

qs1 = Pathway.objects.filter(label__name='x')
qs2 = Pathway.objects.filter(reaction__name='A + B >> C')
qs3 = Pathway.objects.filter(inputer__name='maotai') # 合并到一起
qs = qs1 | qs2 | qs3
这个时候就有可能出现重复的 # 去重方法
qs = qs.distinct()

[py]django强悍的数据库接口(QuerySet API)-增删改查的更多相关文章

  1. Django ORM基本的单表增删改查

    创建表 步骤: 1.app下models.py里创建类(继承models.Model) from django.db import models class UserInfo(models.Model ...

  2. Django中对单表的增删改查

    之前的简单预习,重点在后面 方式一: # create方法的返回值book_obj就是插入book表中的python葵花宝典这本书籍纪录对象   book_obj=Book.objects.creat ...

  3. Django中ORM对数据库的增删改查操作

         前言 什么是ORM?  ORM(对象关系映射)指用面向对象的方法处理数据库中的创建表以及数据的增删改查等操作. 简而言之,就是将数据库的一张表当作一个类,数据库中的每一条记录当作一个对象.在 ...

  4. Django框架(三)—— orm增删改查、Django生命周期

    目录 orm增删改查.Django生命周期 一.orm介绍 二.orm增删改字段 三.Django生命周期 orm增删改查.Django生命周期 一.orm介绍 1.什么是orm ORM即Object ...

  5. Django 笔记(六)mysql增删改查

    注:增删改查表数据在 views.py 内 添加表数据: 删表数据:  改表数据:  查表数据: 常用的查询方法: 常用的查询条件: 相当于SQL语句中的where语句后面的条件 语法:字段名__规则

  6. [py]flask从0到1-模板/增删改查

    flask知识点 1.后端渲染html到前端 render_template 2.后端获取前端数据 request.args.get 3.前端获取后端数据 模板 4.警示消息 flash {{ get ...

  7. Django中ORM对数据库的增删改查

    Django中ORM对数据库数据的增删改查 模板语言 {% for line in press %} {% line.name %} {% endfor %} {% if 条件 %}{% else % ...

  8. Django框架(三)-- orm增删改查、Django生命周期

    一.orm介绍 1.什么是orm ORM即Object Relational Mapping,全称对象关系映射. 2.使用orm的优缺点 优点: 不用写SQL语句 开发效率高 缺点: SQL的效率低 ...

  9. Django创建并连接数据库(实现增删改查)--ORM框架雏形

    第一步:要先创建数据库(orm是不能创建数据库的) 第二步:settings里面指定连接到哪个数据库 DATABASES = { #默认使用的是sqlite3数据库 'default': { 'ENG ...

随机推荐

  1. 百度地图API接口

    js <script type="text/javascript"> // 百度地图API功能 var map = new BMap.Map("map&quo ...

  2. shell编程(一)

    迷迷糊糊中发现了一个学习shell的非常好的教程,从头到尾看了一下,等看完全忘记了,没办法只能记录下来,教程网址http://c.biancheng.net/cpp/view/6994.html 以前 ...

  3. 在本机搭建mycat 单机环境,使用mariadb 伪集群

    首先搭建mairadb的集群 master 使用端口3306 slave 使用端口3406 master 相关配置 在my.ini 文件的[mysqld] 节点中添加或修改如下配置 #允许其他机器re ...

  4. JS - 兼容到ie7的自定义样式的滚动条封装

    demo: html: <!DOCTYPE html> <html lang="en"> <head> <meta charset=&qu ...

  5. 三元组顺序结构实现稀疏矩阵相加,行序优先(Java语言描述)

    不用十字链表也可以稀疏矩阵相加时间复杂度最坏情况达到O(tuA + tuB);思路比较简单就不赘述了,代码如下: 三元组: package 行逻辑链接的顺序表实现稀疏矩阵的相乘; public cla ...

  6. List的五种去重方式

    //set集合去重,不改变原有的顺序 public static void pastLeep1(List<String> list){ System.out.println("l ...

  7. sql management studio正则替换sql

    需要把create proc xxx替换为 drop proc xxx go create proc xxx 方法,使用正则查找替换 create procedure {\[dbo\]\.[^\(]+ ...

  8. iPhone X 上删除白条

    方案一:纯色背景的情况下,解决方案就是background-color在您的body代码上设置属性: 方案二:视口入,viewport-fit=cover: <meta name="v ...

  9. sysbench 压力测试工具

    一.sysbench压力测试工具简介: sysbench是一个开源的.模块化的.跨平台的多线程性能测试工具,可以用来进行CPU.内存.磁盘I/O.线程.数据库的性能测试.目前支持的数据库有MySQL. ...

  10. MacOS 安装 nginx

    brew install nginx 开机启动 $ sudo cp `brew --prefix nginx`/homebrew.mxcl.nginx.plist /Library/LaunchDae ...