返回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. Linux启动过程的C语言代码分析

    1. main函数 参见上方http://www.cnblogs.com/long123king/p/3543872.html,代码跳转到main函数. arch/x86/boot/main.c 1: ...

  2. gitnore文件修改生效方法

        本文首发于cartoon的博客     转载请注明出处:https://cartoonyu.github.io/cartoon-blog 当修改gitnore文件后,常常出现文件不生效的情况, ...

  3. Reqests----Get请求之参数化

    一.环境安装 >>pip install requests 注意:pip很容易就会版本升级,如果用python3的,请使用pip3 install requests 1.初始化版本 2.把 ...

  4. Flatty Shadow图标自动产生器——在线生成各种扁平化 ICON

    在扁平化风格越来越流行的今天,网页.软件界面和图标的设计大都采用了扁平化风格.特别是扁平化图标的设计,摒弃了一切3D元素的设计,阴影.纹理.透视神马的统统不要,让图标简洁高效,富有现代感. 今天给大家 ...

  5. SpringMVC和spring常见面试题总结

    1.什么是Spring MVC ?简单介绍下你对springMVC的理解? Spring MVC是一个基于Java的实现了MVC设计模式的请求驱动类型的轻量级Web框架,通过把Model,View,C ...

  6. redis String 相关命令

  7. apache httpd.conf alias

    参考 Apache alias目录配置 我的环境是 Ubuntu apache2,配置文件目录在 /etc/apache2/sites-available/000-default.conf 在这个配置 ...

  8. ES6形参默认值

    * 形参的默认值----当不传入参数的时候默认使用形参里的默认值 function Point(x = ,y = ) { this.x = x; this.y = y; } //定义一个点的坐标 fu ...

  9. js 数组排序 根据两个字段属性

    var task = [ {name:"aa", taskLevel:"3",createTime:"2019-12-18"}, {name ...

  10. delphi获得文件大小

    大概有这些方法可以获得文件大小 FileSizeByName(需要引用IdGlobal单元) GetFileSize FileSize(不能获得正在使用的文件大小) FileSeek TFileStr ...