聚合查询

关键字:aggregate

from django.db.models import  Max,Min,Sum,Count,Avg

统计所有书的平均价格

models.Book.objects.all().aggregate(Avg('price'))  #拿所有的书籍的价格的平均值

这样的话就可以求最大的价格,最小的价格等

分组查询

关键字:annotate

统计每一本书的作者个数

models.Book.objects.annotate(author_num = Count('author')).values('title')

统计每一个出版社卖的最便宜的书的价格

models.Book.objects.annotate(price_min=Min('book__price')).values('price_min')

统计不止一个作者的图书

models.Book.objects.annotate(author_num = Count('author')).values('author_num').filter(author__num__gt=1)

查询各个作者出的书的总价格

models.Author.objects.annotate(sum_price = Sum('book__price')).values('sum_price')

F与Q查询

F查询

查询卖出数大于库存数

models.Book.objects.filter(maichu__gt=F('kucun'))

将所有的书的价格全部提高100元

models.Book.objects.update(price=F('price')+ 100)

将所有书的名字后面都加上爆款

from django.db.models.functions import Concat
from django.db.models import Value
ret3=models.Product.objects.update(name=Concat(F('name'),Value('爆款')))

Q查询

查询书籍名称是python入门或者价格是54的书

models.Book.objects.filter(Q(title='python入门')|Q(price=54))

查询书籍名称不是python入门或者价格是54的书

models.Book.objects.filter(~Q(title='python入门')|Q(price=54))

Q查询进阶

查询条件由用户输入决定

q = Q()
q.connector = 'or' #将默认and,改为or
q.children.append(('title','python'))
q.children.append(('kucun',666))
res = models.Book.objects.filter(q)

字符串左边跟变量名书写的格式一模一样

ORM中常见字段

ORM字段与MySQL字段对应关系

'AutoField': 'integer AUTO_INCREMENT',
'BigAutoField': 'bigint AUTO_INCREMENT',
'BinaryField': 'longblob',
'BooleanField': 'bool',
'CharField': 'varchar(%(max_length)s)',
'CommaSeparatedIntegerField': 'varchar(%(max_length)s)',
'DateField': 'date',
'DateTimeField': 'datetime',
'DecimalField': 'numeric(%(max_digits)s, %(decimal_places)s)',
'DurationField': 'bigint',
'FileField': 'varchar(%(max_length)s)',
'FilePathField': 'varchar(%(max_length)s)',
'FloatField': 'double precision',
'IntegerField': 'integer',
'BigIntegerField': 'bigint',
'IPAddressField': 'char(15)',
'GenericIPAddressField': 'char(39)',
'NullBooleanField': 'bool',
'OneToOneField': 'integer',
'PositiveIntegerField': 'integer UNSIGNED',
'PositiveSmallIntegerField': 'smallint UNSIGNED',
'SlugField': 'varchar(%(max_length)s)',
'SmallIntegerField': 'smallint',
'TextField': 'longtext',
'TimeField': 'time',
'UUIDField': 'char(32)',

自定义char字段

class MyCharField(models.Field):
def __init__(self,max_length,*args,**kwargs):
self.max_length = max_length
super().__init__(max_length=max_length,*args,**kwargs) def db_type(self, connection):
return 'char(%s)'%self.max_length

查询优化(面试)

only与defer

only会将口号内的字段对应的值 直接封装到返回给你的对象中 点该字段 不需要再走数据库

一旦你点了不在括号内的字段 就会频繁的去走数据库查询

deferonly互为反关系defer会将括号内的字段排除之外,将其他字段对应的值 直接封装到返回给你的对象中,点该其他字段 不需要再走数据库,一旦你点了在括号内的字段 就会频繁的去走数据库查询

select_related与prefetch_related

select_related会自动帮你做连表操作,然后连表之后的数据全部查询出来封装给对象

select_related括号内只能放外键字段,并且多对多字段除外

如果括号内所关联的外键字段还有外键字段,还可以继续连表

select_related(外键字段__外键字段__外键字段...)

prefetch_relate看似是连表操作,其实是子查询,内部不做连表,小号的资源就在查询次数上,但是给用户感觉不出来

Django ORM中的事务操作

ACID:原子性、一致性、隔离性、持久性

from django.db import transaction
with transaction.atomic():
#在该代码块中所写的orm语句 同属于一个事务
#缩进出来之后自动结束

补充知识:

django2.x版本:在建数据库关系的时候需要手动指定2个参数,要告诉django级联更新,级联删除,是否建立外键约束

on_delete,db_constraint

图片转自:https://www.cnblogs.com/Dominic-Ji/

Django基础之模型层(下)的更多相关文章

  1. Django基础之模型层(02)

    1 重要概念 # 多表查询 """ 正向查询 反向查询 当前查询对象是否含有外键字段 如果有就是正向 没有无则是反向 口诀: 正向查询按外键字段 多对多需要额外再加一个. ...

  2. Django基础(3)----模型层-单表操作,多表创建

    昨日内容回顾: 1. {% include '' %} 2. extend base.html: <html> ..... ..... ..... {% block content%} { ...

  3. Django基础之模型层(01)

    内容概要 查询关键字 MySQL select    from    where    group by    having    order by    distinct    limit    r ...

  4. Django基础之模型(models)层(上)

    目录 Django基础之模型(models)层 单表查询 必知必会13条 神奇的双下划线查询 多表查询 外键的字段的增删改查 表与表之间的关联查询 基于双下划线的跨表查询(连表查询) 补充知识 Dja ...

  5. Django的日常-模型层(1)

    目录 Django的日常-模型层(1) 模型层 django测试环境 ORM查询 Django的日常-模型层(1) 模型层 模型层其实就是我们应用名下的models.py文件,我们在里面写入想要创建的 ...

  6. Django的日常-模型层(2)

    目录 Django的日常-模型层(2) 几种常用的查询方式 聚合查询 分组查询 F和Q查询 查询优化相关 orm中常见字段 choices参数 orm的事务操作 Django的日常-模型层(2) 几种 ...

  7. Django学习之模型层

    模型层 查看orm内部sql语句的方法的方法 1.如果是queryset对象,那么可以点query直接查看该queryset的内部sql语句 2.在Django项目的配置文件中,配置一下参数即可实现所 ...

  8. Django - 模型层 - 下

    一.多表 sql 单表 多表 多对一 多对多 一对一 =============================================== 一对多:Book id title price p ...

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

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

随机推荐

  1. DAY 5 & 6

    DAY 5 之前整过一个DP 动态规划  DP 啥是DP? DP等价于DAG!!! (1)无后效性:DP的所有状态之间组成一个DAG (2)最优子结构 (3)阶段性 (4)转移方程:如何计算状态 一般 ...

  2. 阶段3 3.SpringMVC·_04.SpringMVC返回值类型及响应数据类型_3 响应之返回值是void类型

    定义先的标签 返回void 测试默认的跳转 虽然是404但是方法执行了. 默认请求了 testVoid.jsp这个页面.请求路径叫什么 就访问哪个jsp页面. 使用request请求转发 抛出的异常 ...

  3. 创建podspec文件,为自己的项目添加pod支持

    Cocoapods作为iOS开发的包管理器,给我们的开发带来了极大的便利,而且越来越多的第三方类库支持Pod,可以通过Pod傻瓜式的集成到自己的工程中,那么问题来了,我自己也有一系列的小工具类,怎么让 ...

  4. 如何从项目中移除CocoaPods

    一.项目Show in Finder: 删除本地文件(Podfile.Podfile.lock.Pods文件夹) 删除本地生成的xcworkspace文件 打开项目,在Frameworks文件夹下,删 ...

  5. C#通过Oracle.ManagedDataAccess无法访问Oralce (转)

    原文转自:https://www.cnblogs.com/duanjt/p/6955173.html 问题描述:通过C#引用Oracle.ManagedDataAccess.dll访问Oracle,写 ...

  6. JavaScript基础之数组常用方法

    目录 JS 数组常用API 常用属性 常用方法 常见方法语法解释 from方法 isArray concat every fill filter find forEach indexOf join k ...

  7. jvm的学习笔记:二、类的初始化,代码实战(3)

    首次主动此用导致类的初始化 MyParent4 myParent4 = new MyParent4(); MyParent4 myParent5 = new MyParent4(); 输出: MyPa ...

  8. 【AMAD】transitions -- 一个python实现的轻量级,面向对象的有限状态机

    简介 个人评分 简介 Transitions1是使用python实现的有限状态机2. 而有限状态机是实现经典模式 -- 状态模式3的前提. 这个库的API相当优雅,简洁. 另外博客园有人发布博客4介绍 ...

  9. web题

    @php绕过https://www.cnblogs.com/leixiao-/p/9786496.html @step1:F12 step2:抓包 @任何url  http://118.25.14.4 ...

  10. 【机器学习】Learning to Rank之Ranking SVM 简介

    Learning to Rank之Ranking SVM 简介 排序一直是信息检索的核心问题之一,Learning to Rank(简称LTR)用机器学习的思想来解决排序问题(关于Learning t ...