ORM基础4 跨表查询+原子性操作
一、跨表查询
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 跨表查询+原子性操作的更多相关文章
- (19)模型层 -ORM之msql 跨表查询(正向和反向查询)
基于对象的跨表查询 基于对象的跨表查询'''正向和反向查询'''# 正向 ----> 关联字段在当前表中,从当前表向外查叫正向# 反向 ---> 关联字段不在当前表中,当当前表向外查叫反向 ...
- {django模型层(二)多表操作}一 创建模型 二 添加表记录 三 基于对象的跨表查询 四 基于双下划线的跨表查询 五 聚合查询、分组查询、F查询和Q查询
Django基础五之django模型层(二)多表操作 本节目录 一 创建模型 二 添加表记录 三 基于对象的跨表查询 四 基于双下划线的跨表查询 五 聚合查询.分组查询.F查询和Q查询 六 xxx 七 ...
- Django基础(5) ----基于双下划线的跨表查询,聚合查询,分组查询,F查询,Q查询
一.基于双下划线的跨表查询 Django 还提供了一种直观而高效的方式在查询(lookups)中表示关联关系,它能自动确认 SQL JOIN 联系.要做跨关系查询,就使用两个下划线来链接模型(mode ...
- django基础之day04,必知必会13条,双下划线查询,字段增删改查,对象的跨表查询,双下划线的跨表查询
from django.test import TestCase # Create your tests here. import os import sys if __name__ == " ...
- ORM单表查询,跨表查询,分组查询
ORM单表查询,跨表查询,分组查询 单表查询之下划线 models.Tb1.objects.filter(id__lt=10, id__gt=1) # 获取id大于1 且 小于10的值models ...
- Django学习——Django测试环境搭建、单表查询关键字、神奇的双下划线查询(范围查询)、图书管理系统表设计、外键字段操作、跨表查询理论、基于对象的跨表查询、基于双下划线的跨表查询
Django测试环境搭建 ps: 1.pycharm连接数据库都需要提前下载对应的驱动 2.自带的sqlite3对日期格式数据不敏感 如果后续业务需要使用日期辅助筛选数据那么不推荐使用sqlite3 ...
- 基于对象的跨表查询,多对多查询,多对多操作,聚合查询和分组查询,F查询和Q 查询
基于对象的跨表查询 一对多查询(班级表和学生表) 表结构创建 class Class(models.Model): id = models.AutoField(primary_key=True) cn ...
- Django框架第七篇(模型层)--多表操作:一对多/多对多增删改,跨表查询(基于对象、基于双下划线跨表查询),聚合查询,分组查询,F查询与Q查询
一.多表操作 一对多字段的增删改(book表和publish表是一对多关系,publish_id字段) 增 create publish_id 传数字 (publish_id是数据库显示的字段名 ...
- Django框架(十)—— 多表操作:一对一、一对多、多对多的增删改,基于对象/双下划线的跨表查询、聚合查询、分组查询、F查询与Q查询
目录 多表操作:增删改,基于对象/双下划线的跨表查询.聚合查询.分组查询.F查询与Q查询 一.创建多表模型 二.一对多增删改表记录 1.一对多添加记录 2.一对多删除记录 3.一对多修改记录 三.一对 ...
随机推荐
- 2018-8-10-win10-uwp-slider-隐藏显示数值
title author date CreateTime categories win10 uwp slider 隐藏显示数值 lindexi 2018-08-10 19:17:19 +0800 20 ...
- win10 uwp 使用 Border 布局
在 UWP 写一个界面需要将元素排列,在排列元素的时候有特殊的元素叫容器.容器的意思是元素里面包含元素,在 UWP 用到的容器有很多,也可以自己写一个.简单的容器是 Border 边框控件,如控件说的 ...
- POJ 2778 DNA Sequence (ac自动机+矩阵快速幂)
DNA Sequence Description It's well known that DNA Sequence is a sequence only contains A, C, T and G ...
- linux单 open 设备
提供存取控制的强力方式是只允许一个设备一次被一个进程打开(单次打开). 这个技术最 好是避免因为它限制了用户的灵活性. 一个用户可能想运行不同的进程在一个设备上, 一 个读状态信息而另一个写数据. 在 ...
- PHP判断类型
is_bool();//判断是否为布尔型 is_float(); //判断是否为浮点型 is_int(); //判断是否为整型 is_numeric(); //判断是否为数值型 is_ ...
- 51nod 1287加农炮
1287 加农炮 题目来源: Codility 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题 一个长度为M的正整数数组A,表示从左向右的地形高度.测试一种加农炮 ...
- Linux 内核总线方法
有几个给 bus_type 结构定义的方法; 它们允许总线代码作为一个设备核心和单独驱动之 间的中介. 在 2.6.10 内核中定义的方法是: int (*match)(struct device * ...
- Scala中 下划线的用处
From: http://congli.iteye.com/blog/2169401 1.作为“通配符”,类似Java中的*.如import scala.math._ 2.:_*作为一个整体,告诉 ...
- 【Linux】sed笔记
sed - stream editor for filtering and transforming text(用于过滤和转换文本的SED流编辑器),主要是以行为单位进行处理,可以将数据行进行替换. ...
- ES的索引查询和删除
postman 1.查看es状态 get http://127.0.0.1:9200/_cat/health 红色表示数据不可用,黄色表示数据可用,部分副本没有分配,绿色表示一切正常 2.查看所有索引 ...