1 ORM添加

1.1 一对多添加

  方式一:

pub_obj=Publish.objects.get(id=2)
Book.objects.create(title="python",publisher=pub_obj)

  方式二:

Book.objects.create(title="python",publisher_id=2)

1.2 多对多添加

1.2.1 绑定关系

  方式一:

book_obj=models.Book.objects.create(title="python")
author1=models.Author.objects.get(name="jack")
author2=models.Author.objects.get(name="tom")
book_obj.authors.add(author1,author2)

  方式二:

book_obj=models.Book.objects.create(title="python")
author_list=models.Author.objects.all()
book_obj.authors.add(*author_list)

1.2.2 解除关系

book_obj=models.Book.objects.get(title="python")
author1=models.Author.objects.get(name="jack")
book_obj.authors.remove(author1)

  或者解除所有关系

book_obj.authors.clear()

2 ORM查询

2.1 一对多查询

2.1.1 正向查询

  正向查询按字段,进行查询

book_obj=models.Book.objects.filter(title="python").first
pub_name=book_obj.publisher.name # publisher object : 与这本书关联的出版社对象
pub_addr=book_obj.publisher.addr

2.1.2 反向查询

  反向查询,按照表名(小写)_set,进行查询

pub_obj=models.Publish.objects.get(name="机械出版社")
book_list=pub_obj.book_set.all() # 与这个出版社关联的所有书籍对象

2.2 多对多查询

2.2.1 正向查询

  多对多正向查询,按字段进行查询

book_obj=models.Book.objects.filter(title="python").first()
author_list=book_obj.authors.all()

2.2.2 反向查询

  多对多的反向查询,按关联的表名(小写)_set

author1=model.Author.objects.get(name="jack")
book_list=author1.book_set.all()

2.3 一对一查询

2.3.1 正向查询

  一对一正向查询,按字段进行查询

# 查询addr在北京的作者
authorDetail=models.AuthorDetail.objects.get(addr="bj")
author_name=authorDetail.author.name

2.3.2反向查询

  一对一的反向查询,按表名(小写)

author1=models.Author.objects.get(name="jack")
addr=author1.authordetail.addr

2.4 基于双下划线跨表查询

# 查询python这本书的价格
ret=models.Book.objects.filter(title="python").values("price","title")
print(ret) # <QuerySet [{'price': Decimal('122.00')}]> #查询python这本书的出版社的名称和地址
# 1.正向查询 按字段 基于book表
ret=models.Book.objects.filter(title="python").values_list("publisher__name")
print(ret) # 2.反向查询 按表名 if 设置了related_name: 按设置值
ret=models.Publish.objects.filter(bookList__price=333).values_list("name","addr").distinct()
print(ret) # 查询人民出版社出版过的所有书籍名称及价格
ret=models.Book.objects.filter(publisher__name="机械出版社").values("title","price")
print(ret.count()) ret=models.Publish.objects.filter(name="renmin").values("bookList__title","bookList__price")
print(ret.count()) #查询jack出过的所有书籍的名字(多对多)
ret=models.Author.objects.filter(name="jack").values_list("book__title")
print(ret) ret=models.Book.objects.filter(authors__name__contains="eg").values("title")
print(ret) # 地址以沙河开头的的作者出版过的所有书籍名称以及出版社名称
ret=models.Book.objects.filter(authors__authordetail__addr__startswith="sha").values("title","publisher__name")
print(ret)

3 聚合与分组

3.1 聚合

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

# 单纯聚合函数
# 计算所有图书的平均价格
ret=models.Book.objects.all().aggregate(priceSum=Sum("price"))
print(ret) # {'priceSum': Decimal('2158.00')}

3.2 分组

# 统计每一本书的作者个数
ret=models.Book.objects.all().annotate(authors_num=Count("authors")) # QuerySet
print(ret) # [book_obj1,book_obj2,book_obj3,book_obj4,....] # 查询每一个出版社出版过的所有书籍的总价格
#方式1:
ret3=models.Publish.objects.all().annotate(priceSum=Sum("bookList__price"))
ret4 = models.Publish.objects.all().annotate(priceSum=Sum("bookList__price")).values("name","priceSum") # 方式2:
ret5=models.Book.objects.all().values("publisher__name").annotate(priceSum=Sum("price")).values("publisher__name","priceSum")

4 F与Q查询

4.1 F查询

from django.db.models import F,Q
ret=models.Book.objects.filter(comment_num__gt=F("read_num")*2)
models.Book.objects.all().update(price=F("price")+10)

4.2 Q查询

from django.db.models import F,Q
ret=models.Book.objects.filter(comment_num__gt=50,read_num__gt=50)
ret=models.Book.objects.filter(Q(comment_num__gt=100)|Q(read_num__gt=100))

5 ORM修改

  1.obj.name="jack"

    obj.save()          # 效率低

  2.表.objects.all().update(name="jack") # 推荐方法

    注意:update方法是QuerySet数据类型的方法

6 ORM删除

  表.objects.filter(条件).delete()

  注意事项:

    1.delete是QuerySet数据类型的方法

    2.delete是级联删除

django深入-ORM操作的更多相关文章

  1. Django之ORM操作

    Django之ORM操作 前言 Django框架功能齐全自带数据库操作功能,本文主要介绍Django的ORM框架 到目前为止,当我们的程序涉及到数据库相关操作时,我们一般都会这么搞: 创建数据库,设计 ...

  2. Django之ORM操作(聚合 分组、F Q)

    Django之ORM操作(聚合 分组.F Q) 聚合 aggregate()是QuerySet的一个终止子句,也就是说,他返回一个包含一些键值对的字典,在它的后面不可以再进行点(.)操作.   键的名 ...

  3. Django之ORM操作(***)

    Django之ORM操作(***) http请求的流程: url--> 视图view(模板+数据库) --> ORM的功能: 可以转换SQL语句,并做操作. ORM操作数据表: -创建表: ...

  4. 【Django】ORM操作#2

    目录 必知必会的13条查询方法 单表查询之神奇的双下划线 一对多 ForeignKey 多对多 ManyToManyField 在Python脚本中调用Django环境 Django终端打印SQL语句 ...

  5. 【Django】ORM操作#1

    目录 一.介绍 概念 由来 优势 劣势 总结 二.Django中的ORM Django项目使用MySQL Model 快速入门 1. AutoField 2. IntegerField 3. Char ...

  6. django的orm操作优化

    django的orm操作优化 models.py from django.db import models class Author(models.Model): name = models.Char ...

  7. Django中ORM操作

    ORM操作: class UserInfo(models.Model): username = models.CharField(max_length=32) password = models.Ch ...

  8. Django的ORM操作

    ORM操作 select * from tb where id > 1 # 对应关系 models.tb.objects.filter(id__gt=1) models.tb.objects.f ...

  9. Django之ORM操作总结

    Django之ORM总结 表结构 from django.db import models # 一对多:班级与学生 # 多对多:班级与老师 # Create your models here. #创建 ...

  10. Django之ORM操作(重要)

    Django ORM操作 一般操作 看专业的官网文档,做专业的程序员! 必知必会13条   <1> all(): 查询所有结果 <2> get(**kwargs): 返回与所给 ...

随机推荐

  1. 【leetcode 简单】第十题 实现strStr()

    实现 strStr() 函数. 给定一个 haystack 字符串和一个 needle 字符串,在 haystack 字符串中找出 needle 字符串出现的第一个位置 (从0开始).如果不存在,则返 ...

  2. 爬虫实战--利用Scrapy爬取知乎用户信息

    思路: 主要逻辑图:

  3. Friends and Berries URAL - 2067 (计算三点共线和计算的时候的注意点)

    题目链接:https://cn.vjudge.net/problem/URAL-2067 具体思路:判断三点共线就可以了,只有一对点能满足,如果一对就没有那就没有满足的. 在计算的时候,要注意,如果是 ...

  4. php常用代码段

    点击换验证码 <a href=" src="{:U('Reglog/vcode')}" /></a> TP上一条下一条 $prev=$artica ...

  5. CRF++进行中文分词实例

    工具包:https://taku910.github.io/crfpp/#tips 语料:http://sighan.cs.uchicago.edu/bakeoff2005/ 安装: 1)下载linu ...

  6. centos7-sar工具的安装过程及其简单应用

    一.sar工具安装 1.进入yum配置文件目录: cd /etc/yum.repos.d/ 2.vi CentOS-Base.repo命令创建文件CentOS-Base.repo 文件内容见网页:ht ...

  7. Django 1.10文档中文版Part1

    目录 第一章.Django1.10文档组成结构1.1 获取帮助1.2 文档的组织形式1.3 第一步1.4 模型层1.5 视图层1.6 模板层1.7 表单1.8 开发流程1.9 admin站点1.10 ...

  8. javaScript如何跳出多重循环break、continue

    先来说说break和continue之间的区别 for(var i=0;i<10;i++){  if(i>5){  break;  }}console.log(i);  ---6  •当i ...

  9. HDU 2112 Today(Dijkstra+map)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2112 题目大意: 经过锦囊相助,海东集团终于度过了危机,从此,HDU的发展就一直顺风顺水,到了2050 ...

  10. TCP封包解包---如有错误,请纠正!

    最近遇见很多的关于TCP中封包解包的数据,在TCP节点之间的信息传递,每次传送的内容是结构体,所以每次在传送的时候,要将结构体中的数据进行封包,然后当一端接收到数据之后,要对接收到的buf参数中的数据 ...