django深入-ORM操作
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操作的更多相关文章
- Django之ORM操作
Django之ORM操作 前言 Django框架功能齐全自带数据库操作功能,本文主要介绍Django的ORM框架 到目前为止,当我们的程序涉及到数据库相关操作时,我们一般都会这么搞: 创建数据库,设计 ...
- Django之ORM操作(聚合 分组、F Q)
Django之ORM操作(聚合 分组.F Q) 聚合 aggregate()是QuerySet的一个终止子句,也就是说,他返回一个包含一些键值对的字典,在它的后面不可以再进行点(.)操作. 键的名 ...
- Django之ORM操作(***)
Django之ORM操作(***) http请求的流程: url--> 视图view(模板+数据库) --> ORM的功能: 可以转换SQL语句,并做操作. ORM操作数据表: -创建表: ...
- 【Django】ORM操作#2
目录 必知必会的13条查询方法 单表查询之神奇的双下划线 一对多 ForeignKey 多对多 ManyToManyField 在Python脚本中调用Django环境 Django终端打印SQL语句 ...
- 【Django】ORM操作#1
目录 一.介绍 概念 由来 优势 劣势 总结 二.Django中的ORM Django项目使用MySQL Model 快速入门 1. AutoField 2. IntegerField 3. Char ...
- django的orm操作优化
django的orm操作优化 models.py from django.db import models class Author(models.Model): name = models.Char ...
- Django中ORM操作
ORM操作: class UserInfo(models.Model): username = models.CharField(max_length=32) password = models.Ch ...
- Django的ORM操作
ORM操作 select * from tb where id > 1 # 对应关系 models.tb.objects.filter(id__gt=1) models.tb.objects.f ...
- Django之ORM操作总结
Django之ORM总结 表结构 from django.db import models # 一对多:班级与学生 # 多对多:班级与老师 # Create your models here. #创建 ...
- Django之ORM操作(重要)
Django ORM操作 一般操作 看专业的官网文档,做专业的程序员! 必知必会13条 <1> all(): 查询所有结果 <2> get(**kwargs): 返回与所给 ...
随机推荐
- Mac 10.9x下安装配置phonegap3.0开发环境 (涉及android sdk配置)
最近突然想弄一下phonegap,之前一直是听说,没亲自配置开发过.结果配置过程非常艰难啊.特别是android平台的配置,那叫一个麻烦,网上搜了半天都没找到非常好的资料.文章也都是抄来抄去,最烦的就 ...
- PHP非常好用的分页类
分页类: <?php /* * ********************************************* * @类名: page * @参数: $myde_total - 总记 ...
- 图片异或(xor)getflag
题目地址:https://files.cnblogs.com/files/nul1/flag_enc.png.tar 这题是源于:网鼎杯minified 经过测试隧道红色最低通道异常.其余均正常.所以 ...
- 64_p9
python2-termcolor-1.1.0-11.fc26.noarch.rpm 12-Feb-2017 14:05 13610 python2-terminado-0.6-2.fc26.noar ...
- React 16 源码瞎几把解读 【三 点 二】 react中的fiberRoot
〇.先来看看常用的常量 NoWork = 0 noTimeout = undefined HostRoot = 3 NoContext = 0b000; AsyncMode = 0b001; Stri ...
- Serv-U设置允许用户更改密码【转】
最近,公司上了一套Serv-U10.5.0.6的ftp软件,应该是目前最新的版本了.上的第一天就遇到了一个问题,有领导发话了,他需要自己更改密码.找了N久才找到,分享一下. 点击管理界面的用户. 进入 ...
- 「caffe编译bug」 undefined reference to `boost::match_results<__gnu_cxx::__normal_iterator<char const*, std::__cxx11
CXX/LD -o .build_release/tools/test_net.binCXX/LD -o .build_release/tools/convert_annoset.binCXX/LD ...
- NTP路由器配置
14.1. 路由器日志显示时间戳 提问 在路由器 的日志和排错信息里面显示时间 回答 Router#configure terminal Enter configuration commands, o ...
- 【转载】移动开发中的上下左右滑动插件jquery.swipe.js
原文地址http://blog.csdn.net/pvfhv/article/details/3449803/# 源码: (function($) { var old = $.fn.swipe; $. ...
- Jmeter组件和属性(二)
Jmeter脚本开发原则 简单.正确.高效.简单:去除无关的组件,同时能复用的尽量复用.正确:对脚本或者业务正确性进行必要的判断,不能少也不能多.(200),业务错误的情况下,也可能返回200,必须用 ...