一、跨表查询   
  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. 2018-2-13-win10-uwp-InkCanvas控件数据绑定

    title author date CreateTime categories win10 uwp InkCanvas控件数据绑定 lindexi 2018-2-13 17:23:3 +0800 20 ...

  2. Java 5,6,7,8,9,10,11新特性吐血总结

    作者:拔剑少年 简书地址:https://www.jianshu.com/u/dad4d9675892 博客地址:https://it18monkey.github.io 转载请注明出处 java5 ...

  3. Vue中通过属性绑定为元素绑定style行内样式

    1.直接在元素上通过:style的形式,书写样式对象 2.将样式对象定义在data中,并直接引用到:style中 3.在:style中通过数组,引用多个data上的样式对象

  4. JS求数组最大值常用方法

    第一种方法: 循环数组 let ary = [1,2,22,3,99,100],maxNum = ary[0] function getMaxNum(ary){ for(let i = 1,len = ...

  5. Android 最新架构

    1.Android系统架构 最新的Android系统分为五层六区(域): Linux内核层(Linux Kernel):Android系统基于Linux2.6内核,这一层为Android设备各种硬件提 ...

  6. TCPIP四层模型和OSI七层模型对应表

  7. Visio文本相关操作

    三种方式:双击形状输入文本,插入文本框, 文本工具 文本块工具 选择后可以对文本进行移动旋转 如果要给文本加入边框 直接显示线条就可以了 因为都是文本框 添加特殊文本: 插入符号 插入域 比如当前时间 ...

  8. 使用spring boot中的JPA操作数据库

    前言 Spring boot中的JPA 使用的同学都会感觉到他的强大,简直就是神器一般,通俗的说,根本不需要你写sql,这就帮你节省了很多时间,那么下面我们来一起来体验下这款神器吧. 一.在pom中添 ...

  9. sleep()与wait()区别

    1.所在类不一样:sleep在Thread类里面,wait在Object里面. 2.sleep需要抓异常,wait则不用. 3.sleep没有释放锁,wait释放锁. 4.sleep设置了释放时间,w ...

  10. ubuntu conda install ERROR missing write permission错误

    报错: ondaIOError: Missing write permissions in: /usr/local/anaconda3 # # You don't appear to have the ...