一、跨表查询   
  1.# # 正向查找 对象查找
# book_obj = models.Book.objects.get(id=3)
# print(book_obj)
# ret = book_obj.publisher.name
# print(ret)
2.# # 正向查找 字段查找
# ret = models.Book.objects.filter(id=3).values_list("publisher__name")
# print(ret) 3.# # 反向查找 对象查找
# publisher_obj = models.Publisher.objects.get(id=1)
# ret = publisher_obj.books.all().values_list("title")
# print(ret)
4.# # 反向查找 字段查找
# ret = models.Publisher.objects.filter(id=1).values_list("books__title")
# print(ret) # 多对多
# # 查询
author_obj = models.Author.objects.get(id=2)
# print(author_obj.name)
# ret = author_obj.book.all()
# print(ret)
  二、对象 多对多 对表与表之间的关系进行操作
1.# create 创建新对象 1、在book中创建一本新书,在book和author的关联表中添加关联操作
# author_obj.book.create(title="孩子", publisher_id=3) 2.# add 必须添加对象 或 id
# book_obj = models.Book.objects.get(id=12)
# author_obj.book.add(book_obj)
# # add 多个
# book_obj = models.Book.objects.filter(id__gt=5, id__lt=8)
# print(book_obj)
# author_obj.book.add(*book_obj)
# author_obj.book.add(12) 3.# # set 必须要是一个可迭代对象
# author_obj.book.set([8, 11])
# author_obj.save() 4.# remove 对象或id
# # 对象
# book_obj = models.Book.objects.get(id=7)
# author_obj.book.remove(book_obj)
# id
# author_obj.book.remove(5) 5.# # clear
# new_author_obj = models.Author.objects.get(id=5)
# new_author_obj.book.clear()
   注意: models.类(表).操作(create add remove clear),必须要save()
  一对多也有clear和remove方法当时foreginkey必须添加null=True
   三、聚合分组查询
1.# 聚合
from django.db.models import Avg, Sum, Max, Min, Count
# ret = models.Book.objects.all().aggregate(price_avg = Avg("price"))
# print(ret)
# ret = models.Book.objects.all().aggregate(min_price=Min("price"))
# print(ret)
# ret = models.Book.objects.all().aggregate(price_max=Max("price"), price_min=Min("price"), price_avg=Avg("price"), price_sum=Sum("price"))
# print(ret) 2.# 分组查询
# 查询每一本书的作者个数
# ret = models.Book.objects.all().annotate(author_num=Count("author"))
# for book in ret:
# print("书名:{},数量:{}".format(book.title, book.author_num))
# 查询作者数量大于1的书
# ret = models.Book.objects.all().annotate(author_num=Count("author")).filter(author_num__gt=1)
# print(ret)
# 查询各个作者出的书的总价格
# ret = models.Author.objects.all().annotate(price_sum=Sum("book__price")).values_list("name", "price_sum")
# print(ret)
   # 注意:按字段分组的时候,先获取字段,在分组
       一般 annotate(聚合函数)
  四、F和Q查询 注意:
# F和Q
1.# 查询出 库存数 大于 卖出数的 所有书(两个字段做比较)
from django.db.models import F
# ret = models.Book.objects.filter(remain__gt=F("sale"))
# print(ret)
   注意:F查询字段之间进行比较或加减乘除
models.Book.objects.update(sale=(F("sale")+1)*3)
  2.# Q 用于表示或,一般用于filter
   格式:(字段)|(字段)

所有匹配的行将被锁定,直到事务结束。这意味着可以通过锁防止数据被其它事务修改。

entries = Entry.objects.select_for_update().filter(author=request.user)
    五、原子性操作

  # 事物支持原子操作
try:
from django.db import transaction
with transaction.Atomic():
new_publisher = models.Publisher.objects.create(name="星火出版社")
new_book = models.Book.objects.create(
title="笑傲江湖",
price=11.11,
remain=10,
sale=10,
publisher_id=1000
)
except Exception as e:
print(str(e)) # 事物操作不支持原子操作
try:
models.Publisher.objects.create(name="天天出版社")
models.Book.objects.create(
title="小",
price=22.22,
remain=10,
sale=10,
publisher_id=1000
)
except Exception as e:
print(str(e))

Django终端打印SQL语句

# 在settings.py文件中的任意位置
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'handlers': {
'console':{
'level':'DEBUG',
'class':'logging.StreamHandler',
},
},
'loggers': {
'django.db.backends': {
'handlers': ['console'],
'propagate': True,
'level':'DEBUG',
},
}
}

注意:value或value_list里的字段相当于SQL语句select 后面的字段

       annotate分类按照前面的字段进行分类

ORM基础4 跨表查询+原子性操作的更多相关文章

  1. (19)模型层 -ORM之msql 跨表查询(正向和反向查询)

    基于对象的跨表查询 基于对象的跨表查询'''正向和反向查询'''# 正向 ----> 关联字段在当前表中,从当前表向外查叫正向# 反向 ---> 关联字段不在当前表中,当当前表向外查叫反向 ...

  2. {django模型层(二)多表操作}一 创建模型 二 添加表记录 三 基于对象的跨表查询 四 基于双下划线的跨表查询 五 聚合查询、分组查询、F查询和Q查询

    Django基础五之django模型层(二)多表操作 本节目录 一 创建模型 二 添加表记录 三 基于对象的跨表查询 四 基于双下划线的跨表查询 五 聚合查询.分组查询.F查询和Q查询 六 xxx 七 ...

  3. Django基础(5) ----基于双下划线的跨表查询,聚合查询,分组查询,F查询,Q查询

    一.基于双下划线的跨表查询 Django 还提供了一种直观而高效的方式在查询(lookups)中表示关联关系,它能自动确认 SQL JOIN 联系.要做跨关系查询,就使用两个下划线来链接模型(mode ...

  4. django基础之day04,必知必会13条,双下划线查询,字段增删改查,对象的跨表查询,双下划线的跨表查询

    from django.test import TestCase # Create your tests here. import os import sys if __name__ == " ...

  5. ORM单表查询,跨表查询,分组查询

    ORM单表查询,跨表查询,分组查询   单表查询之下划线 models.Tb1.objects.filter(id__lt=10, id__gt=1) # 获取id大于1 且 小于10的值models ...

  6. Django学习——Django测试环境搭建、单表查询关键字、神奇的双下划线查询(范围查询)、图书管理系统表设计、外键字段操作、跨表查询理论、基于对象的跨表查询、基于双下划线的跨表查询

    Django测试环境搭建 ps: 1.pycharm连接数据库都需要提前下载对应的驱动 2.自带的sqlite3对日期格式数据不敏感 如果后续业务需要使用日期辅助筛选数据那么不推荐使用sqlite3 ...

  7. 基于对象的跨表查询,多对多查询,多对多操作,聚合查询和分组查询,F查询和Q 查询

    基于对象的跨表查询 一对多查询(班级表和学生表) 表结构创建 class Class(models.Model): id = models.AutoField(primary_key=True) cn ...

  8. Django框架第七篇(模型层)--多表操作:一对多/多对多增删改,跨表查询(基于对象、基于双下划线跨表查询),聚合查询,分组查询,F查询与Q查询

    一.多表操作 一对多字段的增删改(book表和publish表是一对多关系,publish_id字段) 增  create publish_id 传数字   (publish_id是数据库显示的字段名 ...

  9. Django框架(十)—— 多表操作:一对一、一对多、多对多的增删改,基于对象/双下划线的跨表查询、聚合查询、分组查询、F查询与Q查询

    目录 多表操作:增删改,基于对象/双下划线的跨表查询.聚合查询.分组查询.F查询与Q查询 一.创建多表模型 二.一对多增删改表记录 1.一对多添加记录 2.一对多删除记录 3.一对多修改记录 三.一对 ...

随机推荐

  1. tensorflow在文本处理中的使用——词袋

    代码来源于:tensorflow机器学习实战指南(曾益强 译,2017年9月)——第七章:自然语言处理 代码地址:https://github.com/nfmcclure/tensorflow-coo ...

  2. Python6_模块、包、import、from import的解释

    先说一下模块和包是什么? 模块(module):简单来说一个模块(module)就是一个py文件.在python中是这么约定. 模块里面有函数.类,就是一组代码的集合.   模块显然要有一个名字,这个 ...

  3. freemarker<一>

    FreeMarker是一个模板引擎,一个基于模板生成文本输出的通用工具,使用纯Java编写.FreeMarker被设计用来生成HTMLWeb页面,特别是基于MVC模式的应用程序. 所谓模板,就是一份已 ...

  4. Swagger Editor 本地搭建

    看了很多文章,怎么本地安装都比较乱,一番折腾,最后终于成功本地搭建Swagger Editor,记录如下(Windows 7): 进入命令行: (1)cd E:\Learning\AWS (2)git ...

  5. 以windows服务方式快速部署免安装版Postgres数据库

    目录 以windows服务方式快速部署免安装版Postgres数据库 1.下载Postgresql数据库免安装包 2.安装环境准备及验证 解压文件 测试环境依赖 3.创建并初始化数据目录 创建数据目录 ...

  6. DEVOPS技术实践_15:使用Docker作为Jenkins的slave

    前面实验了使用docker搭建一个jenkins,下面实验使用docker作为jenkins的slave节点 1. 环境准备 一个运行Docker的主机或者群集 Jenkins应该能访问互联网,方便安 ...

  7. 【小技巧】在PS中测量图层间的边距

    今天学到了一个小技巧,前端切页面时会很方便,就是测量间距margin的. 在ps中,选中某个图层,然后按住ctrl键,再移动鼠标,就可以出现这个图层距其他元素的边距,这个太方便了.在此记录一下,免的以 ...

  8. $Poj2956/AcWing116\ The\ Pilots\ Brothers'Refrigerator$ 二进制

    AcWing $Sol$ 假设改变$[x1,y1]$和$[x2,y2]$的状态就可以达到目的.注意到先改变谁对结果是没有影响的!! 所以就可以直接枚举改变状态的结点而不需要注意顺序. $4*4$的矩阵 ...

  9. js的class基础

    title: js的class基础 date: 2020-01-04 13:34:44 tags: --- 基本写法 let log = console.log; class people { con ...

  10. 组件与props简解

    一.创建组件 1.函数式创建 特点: 组件不能访问this对象 组件无法访问生命周期的方法 无状态组件只能访问输入的props,无副作用 function Title() { return <h ...