返回ORM目录 Django ORM

内容目录

  一、F、Q查询
  二、事务
  三、only与defer

一、F、Q查询

"""
Product表中的数据:
1 橡皮 2 2000 3000
2 铅笔 3 12 200
3 华为保时捷 18000 30 23
4 索尼A6000 3680 24 12
"""
# 查询卖出数大于50的商品
# res = models.Product.objects.filter(maichu__gt=50)
# <QuerySet [<Product: 商品对象的名字:橡皮>]>
1. F查询
当想让两个字段进行比较的时候,就需要Django的F()来实现。

(1)先导入F、Q
from django.db.models import F,Q (2)查询卖出数大于库存数的商品
res = models.Product.objects.filter(maichu__gt=F('kucun'))
# <QuerySet [<Product: 商品对象的名字:华为保时捷>, <Product: 商品对象的名字:索尼A6000>]> (3)将所有的商品的价格提高100块
models.Product.objects.update(price=F('price')+100)
"""
修改完价格之后的表数据:
1 橡皮 102 2000 3000
2 铅笔 103 12 200
3 华为保时捷 18100 30 23
4 索尼A6000 3780 24 12
""" (4)将所有商品的名字后面都加上:'特供'
from django.db.models.functions import Concat
from django.db.models import Value
models.Product.objects.update(name=Concat(F('name'), Value('特供'))) 解释:单纯的使用 name=F('price')+'特供' 是行不通的,还得
"""
修改之后的数据:
1 橡皮特供 102 2000 3000
2 铅笔特供 103 12 200
3 华为保时捷特供 18100 30 23
4 索尼A6000特供 3780 24 12
"""
2. Q查询
(1)res = models.Product.objects.filter(price=102)
# <QuerySet [<Product: 商品对象的名字:橡皮特供>]> (2)res = models.Product.objects.filter(Q(price=103), Q(name='橡皮特供')) # and
# <QuerySet []> (3)res = models.Product.objects.filter(Q(price=103) | Q(name='橡皮特供')) # or
# <QuerySet [<Product: 商品对象的名字:橡皮特供>, <Product: 商品对象的名字:铅笔特供>]> (4)二者混合使用 需要注意的是Q对象必须放在普通的过滤条件前面
res = models.Product.objects.filter(~Q(name='橡皮特供'), price=103)
# <QuerySet [<Product: 商品对象的名字:铅笔特供>]> 非橡皮特供,且价格为103的商品 # 当要查询的条件是用户输入进来的时候,可以动态的添加
q = Q()
q.connector = 'or' # 通过这个参数可以将Q对象默认的and关系变成or
q.children.append(('price', 102))
q.children.append(('name', '橡皮特供'))
res = models.Product.objects.filter(q) # Q对象查询默认也是and
# <QuerySet [<Product: 商品对象的名字:橡皮特供>]>

二、事务

(1)事务的ACID
"""
原子性
一致性
隔离性
持久性
"""
(2) 代码实现:
from django.db import transaction
from django.db.models import F
with transaction.atomic():
# 在with代码块儿写你的事务操作
models.Product.objects.filter(id=1).update(kucun=F('kucun')-1)
models.Product.objects.filter(id=1).update(maichu=F('maichu')+1)
# 写其他代码逻辑

三、only与defer

1.作为参照的例子
res = models.Product.objects.values('name')
<QuerySet [{'name': '橡皮特供'}, {'name': '铅笔特供'}, {'name': '华为保时捷特供'}, {'name': '索尼A6000特供'}]> 2.only和defer,查询拿到的都是对象,但是两者是相反的 res = models.Product.objects.only('name')
res = models.Product.objects.defer('name')
for i in res:
print(i.name) (1)从执行结果来看,都会出现下面的查询结果,区别在于,only 执行的SQL语句,只会将指定字段的数据取出来,defer则是取出除指定的字段的其他所有数据,
(2)但是呢,取出的对象,还是可以点出相应字段的属性,他是会去执行相应的SQL语句,再次去数据库中查询数据。
(3)上面代码执行的结果如下(结果相同):
# <QuerySet [<Product: 商品对象的名字:橡皮特供>, <Product: 商品对象的名字:铅笔特供>, <Product: 商品对象的名字:华为保时捷特供>, <Product: 商品对象的名字:索尼A6000特供>]>
												

Django ORM 之F、Q查询与事务的更多相关文章

  1. Django---Django的ORM的一对多操作(外键操作),ORM的多对多操作(关系管理对象),ORM的分组聚合,ORM的F字段查询和Q字段条件查询,Django的事务操作,额外(Django的终端打印SQL语句,脚本调试)

    Django---Django的ORM的一对多操作(外键操作),ORM的多对多操作(关系管理对象),ORM的分组聚合,ORM的F字段查询和Q字段条件查询,Django的事务操作,额外(Django的终 ...

  2. ORM之自关联、add、set方法、聚合函数、F、Q查询和事务

    一.外键自关联(一对多) 1.建表 # 评论表 class Comment(models.Model): id = models.AutoField(primary_key=True) content ...

  3. Django ORM (四) annotate,F,Q 查询

    annotate 可以通过计算查询结果中每一个对象所关联的对象集合,从而得出总计值(也可以是平均值或总和),即为查询集的每一项生成聚合. from django.shortcuts import re ...

  4. Django框架08 /聚合查询、分组、F/Q查询、原生sql相关

    Django框架08 /聚合查询.分组.F/Q查询.原生sql相关 目录 Django框架08 /聚合查询.分组.F/Q查询.原生sql相关 1. 聚合查询 2. 分组 3. F查询和Q查询 4. o ...

  5. Django day08 多表操作 (五) 聚合,分组查询 和 F,Q查询

    一:聚合,分组查询 二:F, Q查询

  6. 数据库开发-Django ORM的单表查询

    数据库开发-Django ORM的单表查询 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.查询集 1>.查询集相关概述 查询会返回结果的集,它是django.db.mod ...

  7. 数据库开发-Django ORM的多对多查询

    数据库开发-Django ORM的多对多查询 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.联合主键问题 CREATE TABLE `employees` ( `emp_no` ...

  8. 数据库开发-Django ORM的一对多查询

    数据库开发-Django ORM的一对多查询 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.联合主键问题 CREATE TABLE `employees` ( `emp_no` ...

  9. python 之 Django框架(orm单表查询、orm多表查询、聚合查询、分组查询、F查询、 Q查询、事务、Django ORM执行原生SQL)

    12.329 orm单表查询 import os if __name__ == '__main__': # 指定当前py脚本需要加载的Django项目配置信息 os.environ.setdefaul ...

随机推荐

  1. 如何从ST官网下载STM32标准库

    Frm:https://blog.csdn.net/k1ang/article/details/79645044

  2. 前端通过url页面传值

    例子:从A页面将‘myId’传到B页面 1.A页面传值 var url = encodeURI("html/editPostcard.html?myId="+ myId); win ...

  3. 剑指offer——75不用加减乘除做加法

    题目描述 写一个函数,求两个整数之和,要求在函数体内不得使用+.-.*./四则运算符号.   题解: 使用位运算   class Solution { public: int Add(int num1 ...

  4. 净心诀---python3装饰器

    python3装饰器 装饰器作用 简单理解:可以为已有函数添加额外功能 例: 已有2个函数如下 def MyFunc1(): print("This is a print function1 ...

  5. 2018年第九届蓝桥杯B组第四题:摔手机题解

    摔手机 摔手机 动态规划  在蓝桥杯的时候遇到一次 当时没有做对  看了题解也没明白  如今再次遇到这个类似的题目 于是拿出来补补吧 摔手机题目如下: 星球的居民脾气不太好,但好在他们生气的时候唯一的 ...

  6. windows IIS FTP 不支持创建多级目录

    昨天因为这个事情搞了好久,因为客户那边使用的是IIS 上的FTP ,想着都差不多试着运行,结果竟然报错,说"错误550 文件不可用" 是在GetResponse()出现的异常,我用 ...

  7. GIT 部分记录

    关于版本回退 git reset HEAD^  #回退a.py这个文件的版本到上一个版本  git reset HEAD^ a.py  git reset HEAD a.py  我试了一下以上2种方式 ...

  8. leetcood学习笔记-965-单值二叉树

    题目描述; 第一次提交; class Solution: def isUnivalTree(self, root: TreeNode) -> bool: if root == None: ret ...

  9. Spring,SpringMVC,SpringBoot,SpringCloud有什么区别和联系?

    简单介绍 Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架.Spring使你能够编写更干净.更可管理.并且更易于测试的代码. Spring MVC是Spring的一个模块,一 ...

  10. SpringMVC 拦截器原理

    前言 SpringMVC 拦截器也是Aop(面向切面)思想构建,但不是 Spring Aop 动态代理实现的, 主要采用责任链和适配器的设计模式来实现,直接嵌入到 SpringMVC 入口代码里面. ...