注意

  • 只要和数据库相关的功能, 基本在 django.db.models 里面

聚合查询

  • 关键字: aggregate
  • 用法 : aggregate(变量名=聚合函数('字段名')
  • 返回的是一个字典, 字典的键就是上面的变量名
# 1.求书籍的最高价格
res = models.Book.objects.aggregate(max=Max('price'))
print(res) # {'max': Decimal('118.88')} # 2.求书籍总价格
res = models.Book.objects.aggregate(sum=Sum('price'))
print(res) # {'sum': Decimal('323.31')} # 3.求书籍的平均价格
res = models.Book.objects.aggregate(avg=Avg('price'))
print(res) # {'avg': 107.77}

分组查询

  • 通常和聚合函数搭配使用
  • 关键字: annotate(变量名=聚合函数()).values('变量名')
# 1.统计每一本书的作者个数(正向)
res = models.Book.objects.annotate(author_num=Count('authors__id')).values('title', 'author_num')
print(res) # 2.每个出版社最便宜书的价格(反向)
res = models.Publish.objects.annotate(min_price=Min('book__price')).values('name', 'min_price')
print(res)

F与Q查询

  • F() 方法可以直接拿到字段对应的值
# 先导入
from django.db.models import F, Q # F()方法可以直接拿到某个字段对应的值 # 1.查询库存大于卖出的书籍
res = models.Book.objects.filter(stock_quantity__gt=F('sold_quantity')).values('title')
print(res) # 2.将所有书的价格上涨10元
models.Book.objects.all().update(price=F('price') + 10) # 3.将所有的书名后面加上 '新款', 字符串操作需要借助Concat方法
from django.db.models.functions import Concat
from django.db.models import Value
models.Book.objects.all().update(title=Concat(F('title'), Value('新款')))
  • filter()方法内多个条件用逗号隔开表示的and关系, 我们可以借助Q()方法来实现or和not关系
  • or : |
  • not: ~
  • Q() 的高级方法: 实例化对象, 利用对象来绑定查询条件, 支持字符串条件查询
# Q()的基本用法
# 1.查询书籍名称是三国演义或者库存大于500
res = models.Book.objects.filter(Q(title='三国演义') | Q(stock_quantity__gt=500))
print(res) # 2.查询书籍名称不是三国演义的
res = models.Book.objects.filter(~Q(title='三国演义'))
print(res) # Q()的高级用法
q = Q()
q.connector = 'or' # 默认是and
q.children.append(('title', '三国演义'))
q.children.append(('stock_quantity__gt', '500'))
res = models.Book.objects.filter(q)
print(res)

orm字段和参数

  • 常用字段
字段类型 参数 描述
AutoFiled primary_key=True 必填参数 用来主键字段
CharField max_length 必填参数 相当与MySQL中的varchar()
IntegerField int32, 不能用来存手机号码, 位数不够, 可以用字符串存
DataTimeField / DataField auto_now=True 每次更新数据记录时auto_now_add=True 创建数据记录时 年月日时分秒/年月日
BigIntegerField int64
EmailField varchar(254)
DecimalField max_digits , decimal_places 必填参数 小数
BooleanField 布尔值
TextField 大段文本
FileField upload_to = " " 上传文件的保存路径 storage = None 存储组件,默认django.core.files.storage.FileSystemStorage 文件路径
  • 通用参数
参数 效果
null=True 可以为空
unique=True 字段必须是唯一的 (并设置索引)
db_index=True 设置索引
dufault 设置默认值

自定义字段类型

  • 查看django字段类型的源码, 发现都是一个个类, 并且都继承 Field

  • 我们在 models.py 中创建自定义类, 继承 models.Field

# 自定义char类型字段
class MyCharField(models.Field):
def __init__(self, max_length, *args, **kwargs):
self.max_length = max_length # 调用父类的__init__方法, 将参数按关键字参数传入
super().__init__(max_length=max_length, *args, **kwargs) # 返回MySQL字段类型
def db_type(self, connection):
return f'char({self.max_length})' # char(max_length)

事务

  • 事务是由sql语句组成的逻辑单元, 是一整体概念

ACID

  • 原子性: 事务是最小执行单元, 不能再分了
  • 一致性: 事务开始前和结束后数据库的数据整体上是一致的
  • 隔离性: 多个事务之间有可以做到相互不影响
  • 持久性: 事务的结果对数据库的影响是永久的

三大范式

  • 每个字段都是不可再拆分的
  • 要求表中要有主键,表中其他其他字段都依赖于主键,因此第二范式只要记住主键约束就好了
  • 要求表中不能有其他表中存在的、存储相同信息的字段,通常实现是在通过外键去建立关联,因此第三范式只要记住外键约束就好了。

开启事务

from django.db.import transaction

with transaction.atomic():
# 在该缩进内书写数据库操作代码
# 缩进内的所有代码, 都属于一个事务
pass

Django 06的更多相关文章

  1. Django 06 Django模型基础1(ORM简介、数据库连接配置、模型的创建与映射、数据的增删改查)

    Django 06 Django模型基础1(ORM简介.数据库连接配置.模型的创建与映射.数据的增删改查) 一.ORM系统 #django模型映射关系 #模型类-----数据表 #类属性-----表字 ...

  2. day63 Pyhton 框架Django 06

    内容回顾 1.装饰器 装饰器:是一个闭包函数,在不改变原函数的代码和调用方式的基础上,给原函数增加功能. def wrapper(func): def inner(*args,**kwargs): # ...

  3. 06: Django Admin

    目录:Django其他篇 01:Django基础篇 02:Django进阶篇 03:Django数据库操作--->Model 04: Form 验证用户数据 & 生成html 05:Mo ...

  4. Django框架06 /orm多表操作

    Django框架06 /orm多表操作 目录 Django框架06 /orm多表操作 1. admin相关操作 2. 创建模型 3. 增加 4. 删除 5. 修改 6. 基于对象的跨表查询 7. 基于 ...

  5. 06 Django REST Framework 版本控制

    01-版本控制 对接口进行版本控制只是一种杀死已部署客户端的“礼貌”方式. - 罗伊菲尔丁. 1. API版本控制允许您更改不同客户端之间的行为.REST框架提供了许多不同的版本控制方案. 2. 版本 ...

  6. Django REST Framework API Guide 06

    本节大纲 1.Validators 2.Authentication Validators 在REST框架中处理验证的大多数时间,您将仅仅依赖于缺省字段验证,或在序列化器或字段类上编写显式验证方法.但 ...

  7. 06 django的用户认证组件

    1.用户认证组件 用户认证组件: 功能:用session记录登录验证状态 前提:用户表:django自带的auth_user 创建超级用户: python3 manage.py createsuper ...

  8. Django 2.0 学习(06):Django 视图(进阶)

    概述 Django中的特方法,该方法代表了Django的Web页面,并且视图具有特定的模板.以博客应用为例进行说明,在博客应用中应该包含下面的视图: 博客主页:显示最近的一些记录: 详细页面:单个详细 ...

  9. 06 - Django应用第三步

    知识点 1) 编写urls 配合include()的URL查找过程 获取正则抓取的值并命名, 给url取名 2) 模板的编写 for循环的遍历 用点的方式执行函数, 不带括号 3) 视图函数的编写 H ...

随机推荐

  1. PHP实现日历签到,并实现累计积分功能

    在网站开发过程中我们会经常用到签到功能来奖励用户积分,或者做一些其他活动.这次项目开发过程中做了日历签到,因为没有经验所有走了很多弯路,再次记录过程和步骤. 1.日历签到样式:使用的是calendar ...

  2. PHP 教你使用 Swoole-Tracker 秒级定位 PHP 卡死问题

    PHPer 肯定收到过这样的投诉:小菊花一直在转!你们网站怎么这么卡!当我们线上业务遇到这种卡住(阻塞)的情况,大部分 PHPer 会两眼一抹黑,随后想起那句名言:性能瓶颈都在数据库然后把锅甩给DBA ...

  3. Python 面向对象-下篇

    面向对象是一种编程方式,此编程方式的实现是基于对 类 和 对象 的使用 类 是一个模板,模板中包装了多个“函数”供使用(可以讲多函数中公用的变量封装到对象中) 对象,根据模板创建的实例(即:对象),实 ...

  4. 力扣(LeetCode)2的幂 个人题解

    给定一个整数,编写一个函数来判断它是否是 2 的幂次方. 示例 1: 输入: 1 输出: true 解释: 20 = 1 示例 2: 输入: 16 输出: true 解释: 24 = 16 示这题是考 ...

  5. 使用ASP.NET Core 3.x 构建 RESTful API - 3.2 路由和HTTP方法

    ASP.NET Core 3.x 的路由 路由机制会把一个请求的URI映射到一个Controller上面的Action,所以当你发送一个HTTP请求的时候,MVC框架会解析这个请求的URI,并尝试着把 ...

  6. 从壹开始 [ Design Pattern ] 之二 ║ 单例模式 与 Singleton

    前言 这一篇来源我的公众号,如果你没看过,正好直接看看,如果看过了也可以再看看,我稍微修改了一些内容,今天讲解的内容如下: 一.什么是单例模式 [单例模式],英文名称:Singleton Patter ...

  7. web前端开发面试题(Vue.js)

    1.active-class是哪个组件的属性?嵌套路由怎么定义? 答:vue-router模块的router-link组件. 2.怎么定义vue-router的动态路由?怎么获取传过来的动态参数?  ...

  8. python3 之 内置函数range()

    一.语法: range(stop) range(start,stop,step) start:计数从start开始,默认是从0开始.eg:range(5)等价于range(0,5) stop:计数到s ...

  9. HTML、CSS基础知识

    前端基础 1. CSS 8 1.1. CSS叫做层叠样式表,用来设置页面中元素的样式.背景颜色.字体颜色.字体大小... 8 1.2. CSS负责结构.表现.行为中的表现 8 1.3. 编写的位置 8 ...

  10. Java集合框架 10 连问,你有被问过吗?

    首先要说一下,本文对这些Java集合框架的面试题只做了一个总结式的回答,对每一道题目,都值得深入去了解一下(什么是扎实基本功,这些就是基本功~~),后续可能对每一道题目拆开独立篇章来深入讲解一下. 大 ...