一、跨表查询   
  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. linux poll 和 select

    使用非阻塞 I/O 的应用程序常常使用 poll, select, 和 epoll 系统调用. poll, select 和 epoll 本质上有相同的功能: 每个允许一个进程来决定它是否可读或者写一 ...

  2. 修改github上的项目语言类型

    当在github上上传一个项目时,可能会出现一个问题就是项目代码类型是自动生成的,可能与我们实际项目代码种类不匹配,此时就需要修改项目语言类型了. 由于无法直接更改,所以用到此方法: 在你的项目根目录 ...

  3. 在小程序内点击按钮分享H5网页给好友或者朋友圈

    在小程序内点击按钮分享H5网页给好友或者朋友圈 首先需要建立h5容器文件夹 页面.wxml <navigator url="/pages/report-await/fouryearh5 ...

  4. Linux 内核 /sys/class类

    我们在本章中要考察最后的设备模型概念是类.一个类是一个设备的高级视图, 它抽象出 低级的实现细节. 驱动可以见到一个 SCSI 磁盘或者一个 ATA 磁盘, 在类的级别, 它们都 是磁盘. 类允许用户 ...

  5. Fetch 记录

    encodeURI()不会对本身属于URI的特殊字符进行编码,例如冒号.正斜杠.问号和井字号:而encodeURIComponent()则会对它发现的任何非标准字符进行编码. Fetch 请求body ...

  6. CodeForces - 617E XOR and Favorite Number (莫队+前缀和)

    Bob has a favorite number k and ai of length n. Now he asks you to answer m queries. Each query is g ...

  7. supported platform

    Target name Platform Architecture Endianness Developer(s) Known Issues/Notes adm5120 Infineon/ADMtek ...

  8. 微信群打卡机器人XiaoV项目开源 | 蔡培培的独立博客

    原文首发于蔡培培的独立博客.原文链接<微信群打卡机器人XiaoV项目开源>. 5月21日,在米花(后面" 亚里士多德式友谊"专题会提及)的影响下,决定搞个私人运动群,拉 ...

  9. Elasticsearch介绍和安装

    Elasticsearch介绍和安装 软件包: 链接:https://pan.baidu.com/s/1O_C0JQGfF8sC_OtcCCLNoQ 提取码:3iai 1.1.简介 1.1.1.Ela ...

  10. mysql:数据库与实例的区别

    题记:最近想更深入的了解mysql,所以买了一些书在学习,趁着这个机会开个坑,整理一下一些我认为重要的知识点. 刚工作那会经常能听到组长提到实例这个词,一开始我以为是服务器... 数据库(databa ...