Django的orm操作之表查询二
复习
单表查询
# 单表操作
# 增
# 方式1
user_obj=models.User.objects.create(**kwargs) # 之一create
# 方式2
user_obj=models.User(**kwargs)
user_obj.save()
# 查
user_queryset=models.User.objects.filter(**kwargs) # 多个过滤条件是and关系
user_obj=models.User.objects.get() # 不推荐使用
users_queryset=models.User.objects.all() # 惰性查询
# 改
user_queryset=models.User.objects.filter(**kwargs).update(**kwargs) # 批量更新
user_obj=models.User.objects.filter(**kwargs).first()
user_obj.name='json'
user_obj.save()
user_obj.update() # 对象没有update方法
# 删
models.User.objects.filter(**kwargs).delete() # 批量删除
user_obj=models.User.objects.filter(**kwargs).first()
user_obj.delete()
多表查询
表关系:
一对一(OneToOneField)
一对多(ForeignKey)
多对多(ManyToManyField)
外键字段的增删改查
# 一对多字段的增删改查(publish)
# 增
models.Book.objects.create(publish_id=1)
publish_obj=models.Pulish.objects.filter(pk=1).first()
models.Book.objects.create(publish=publish_obj)
# 改
book_obj=models.Book.objects.filter(pk=1).first()
book_obj.publish=new_publish_obj
book_obj=models.Book.objects.filter(pk=1).update(publish_id=2)
book_obj=models.Book.objects.filter(pk=1).update(publish=publish_obj)
# 删
# 删除出版社会级联删除该出版社对应的所有的数据
# 多对多字段增删改查
# 增
add()
# 查
# 改
set() :必须接收一个可迭代对象
# 删
remove()
# 上面是三个都支持多个数字或对象
清空:clear()
跨表查询
# 正向:关联字段在你当前这张表,查询另一张表
# 反向: 关联字段不在你这张表,查询另一张表
# 正反向总结: 正向查询按字段,反向查询按表名小写(********)
# 基于对象的跨表查询(子查询)
# 正向
models.Book.objects.filter(pk=1).first()
book_obj.publish.addr # (book_obj.publish--->拿到出版社对象)
book_obj.author # app01.Auhor.None
book_obj.author.all() #
# 反向
publish_obj=models.Publish.objects.filter(pk=1).first()
publish_obj.book_set.all() # 查询单个数据直接拿,多个数据加个all
# 基于双下划线的跨表查询(联表查询)
res=models.Book.objects.filter(publish__name='东方出版社',title='瓶梅').values('title','publish__name','author__authordetail__phone')
queryset对象.query 可以查看内部对象的sql语句
all()
filter()
values()
value_list()
order_by()
reverse()
distinct()
exclude()
count() 计数
exist() 布尔值
get() 数据对象本身
first() 返回数据对象本身
last() 返回数据对象本身
聚合函数
from django.db.models import Max,Min,Sum,Count,Avg
# 聚合查询
aggragate()
# 分组查询(group by)
annotate() group_concat() concat()
F&Q查询
# 过滤的条件语句,是另外一个条件过滤出来的数据
# 卖出大于库存
# F查询
from djamgo.db.models import F,Q
res=models.Product.objects.filter(maichu__gt=F('kucun'))
print(res)
# 将所有商品的价格提高100块
models.Product.objects.update(price=F('price')+100)
# 将所有商品的名字后面都加一个‘爆款’
from django.db.models.functions import Concat
from django.db.models import Value
models.Product.objects.update(name=Concat(F('name'),Value('爆款')))
# Q查询
from djamgo.db.models import Q
res=models.Product.objects.filter(Q(price=188.88,Q(name='连衣裙爆款')) # and
res=models.Product.objects.filter(Q(price=188.88)|Q(name='连衣裙爆款')) # | or
res=models.Product.objects.filter(Q(price=188.88)|~Q(name='连衣裙爆款')) # | not
# Q对象的另外一种用法
form django.db.models import F,Q
res=models.Product.objects.filter(Q(price=188.88)|Q(name='连衣裙爆款')) # | or
from django.test import TestCase
# Create your tests here.
import os
import sys
if __name__ == "__main__":
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "day58.settings")
import django
django.setup()
from app01 import models
# 查询卖出数量大于1000的商品
res = models.Product.objects.filter(salary_count__gt=1000).values('name', 'salary_count')
print(res)
# 查询卖出数量大于库存数量的商品信息
from django.db.models import F, Q
res = models.Product.objects.filter(salary_count__gt=F('inventory_count')).values('salary_count', 'inventory_count')
print(res)
# 查询卖出数量小于等于库存数量的商品的销售数量和商品库存
res = models.Product.objects.filter(salary_count__lte=F('inventory_count')).values('salary_count',
'inventory_count')
print(res)
# 将所有的商品的价格提高100块
res = models.Product.objects.update(price=F('price') + 100) # res 是受影响的行数
print(res)
# 将所有商品的名字后面都加一个爆款
# 对于字符串的拼接 还需要导入两个模块
from django.db.models.functions import Concat
from django.db.models import Value
# models.Product.objects.update(name=Concat(F('name'), Value('1')))
# Q查询
# Q(filter里面条件都是与,Q支持与或非)
# 1.查询 卖出数大于100 或者 价格小于100块的
res = models.Product.objects.filter(Q(salary_count__gt=1000) | Q(price__lt=6000)) # or
print('Q1', res)
# 2.查询 库存数是100 并且 卖出数不是0 的产品
res = models.Product.objects.filter(Q(inventory_count__gt=900), Q(salary_count__gt=1000)) # and
print(res)
# 3.查询 产品名包含新款, 并且库存数大于60的
res = models.Product.objects.filter(Q(name__contains='ipho'), ~Q(inventory_count=1000)) # and
print(res)
# Q对象补充(******)
from django.db.models import F, Q
q = Q()
q.connector = 'or' # 通过这个参数可以将Q对象默认的and关系变成or
q.children.append(('price',188.88))
q.children.append(('name','高跟鞋爆款'))
res = models.Product.objects.filter(q) # Q对象查询默认也是and
print(res)
# 事务
from django.db import transaction
try:
# 开启事务
with transaction.atomic():
# 商品销售数量+1
models.Product.objects.filter(id=1).update(salary_count=F('salary_count') + 1)
# 商品库存数量减1
models.Product.objects.filter(id=1).update(inventory_count=F('inventory_count') - 1)
except Exception as e:
print(e)
Django的orm操作之表查询二的更多相关文章
- Django的orm练习---多表查询
Django的orm练习---多表查询 表关系如下 表结构 : from django.db import models # Create your models here. # 多对多-----&g ...
- 数据库开发-Django ORM的单表查询
数据库开发-Django ORM的单表查询 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.查询集 1>.查询集相关概述 查询会返回结果的集,它是django.db.mod ...
- Django之ORM操作
Django之ORM操作 前言 Django框架功能齐全自带数据库操作功能,本文主要介绍Django的ORM框架 到目前为止,当我们的程序涉及到数据库相关操作时,我们一般都会这么搞: 创建数据库,设计 ...
- Django之ORM操作(聚合 分组、F Q)
Django之ORM操作(聚合 分组.F Q) 聚合 aggregate()是QuerySet的一个终止子句,也就是说,他返回一个包含一些键值对的字典,在它的后面不可以再进行点(.)操作. 键的名 ...
- django 通过orm操作数据库
Django Model 每一个Django Model都继承自django.db.models.Model 在Model当中每一个属性attribute都代表一个database field 通过D ...
- 【Django】ORM操作#2
目录 必知必会的13条查询方法 单表查询之神奇的双下划线 一对多 ForeignKey 多对多 ManyToManyField 在Python脚本中调用Django环境 Django终端打印SQL语句 ...
- 【Django】ORM操作#1
目录 一.介绍 概念 由来 优势 劣势 总结 二.Django中的ORM Django项目使用MySQL Model 快速入门 1. AutoField 2. IntegerField 3. Char ...
- ORM的多表查询详述
ORM的多表查询 ORM最核心与用的最多的地方就是跨表查询了.这里的"跨表查询"分为以下几种:基于对象的跨表查询.基于双下划线的跨表查询.聚合查询.F与Q查询以及分组查询. 下面就 ...
- 第五章、Django之模型层----多表查询
目录 第五章.Django之模型层----多表查询 一.一对多字段增删改查 1.增 2.查 3.改 4. 删除 二.多对多的增删改查 1. 增 2. 改 3. 删 三.ORM跨表查询 四.正反向的概念 ...
随机推荐
- 洛谷p1776宝物筛选
宝物筛选 多重背包问题 物品数目已知 可以枚举每个物品 当做01背包来做 不过会超时 此时需要二进制拆分来优化 分解成新的物品 再跑一遍01背包即可 //二进制拆分+01背包 //设f[j]表示前i件 ...
- Http状态码梳理汇总
常见的状态代码为:200 - 服务器成功返回网页404 - 请求的网页不存在503 - 服务器暂时不可用 1xx(临时响应) 用于表示临时响应并需要请求者执行操作才能继续的状态代码.代码 说明 100 ...
- fping 命令说明
参数: -a 表示只在输出报告⾥列出当前存活的IP -d 解析主机名 -f 参数表示读⼊这个文件 -s 显示汇总信息 -g 指定⽹网段
- SQL之存储过程详细介绍及语法(转)
1:定义 存储过程(stored procedure)是一组为了完成特定功能的SQL语句集合,经编译后存储在服务器端的数据库中,利用存储过程可以加速SQL语句的执行. 存储过程分为系统存储过程和自定义 ...
- 石锤了!google彻底断供华为,只能加速鸿蒙生态的形成
前言 操作系统是当今科技行业的灵魂,而即将推出这款操作系统是一个集电脑.手机.汽车等设备于一体的系统.如今手机行业里已经是一片红海了,竞争相当激烈,但是竞争归竞争,但是一旦扯上别的事就更麻烦了,像华为 ...
- 某邀请赛misc key家用完整版
目录 题目下载 提示 解题过程 1.提取RGB值 2.找到key 3.循环异或,得到flag 反思 题目下载 题目名:key 提示 提取钥匙中特殊颜色的RGB循环异或KEY值 解题过程 1.提取RGB ...
- suface 触控笔
触控笔直接就可以书写,顶部橡皮擦可用. 但如果要使用笔上的按键(如单击启动OneNote),必须要用蓝牙进行配对.笔使用一节AAAA电池(九号电池)供电. 连接方法: 准备好surface触控笔,并确 ...
- selenium爬虫入门(selenium+Java+chrome)
selenium是一个开源的测试化框架,可以直接在浏览器中运行,就像用户直接操作浏览器一样,十分方便.它支持主流的浏览器:chrome,Firefox,IE等,同时它可以使用Java,python,J ...
- Image动画
前几课讲的静态Image挺有趣的,但是如果能有动画的效果,那就更有趣了,mPython做出动画效果也不难.用images的列表,list. 下面就是一个列表: eggs bacon tomatoes ...
- 用shell脚本批量进行xss跨站攻击请求
由于执行的xss攻击请求他多了,初步估计要执行83次,而且还要执行3篇,如果手工一个一个去执行,说出去,我还配叫自动化大师吗: 有鉴于此,边打算自己编写一个脚本进行批量执行: 而短脚本的编写,非she ...