F表达式是用来优化ORM操作数据库的。

举个例子:我们做口罩的公司要将所有员工的薪水增加2000元,如果按照正常的流程,应该是先从数据库中提取所有的员工的工资到Python内存中,然后使用Python代码在员工工资的基础上增加2000元,最后在保存到数据库中,这里面涉及到的流程就是,首先从数据库中提取数据到Python内存中,然后在Python内存中做完运算,之后再保存到数据库中。示例代码如下:
from django.db.models import F
from django.http import HttpResponse
from .models import BookOrder # F表达式的用法详解:F表达式并不会真正的到数据库中查询数据,仅仅只是起到一个标识的作用,告诉sql语句目前的值为多少。
def index2(request):
# 1. 同样也可以先提取出所有的订单,并且将订单中的price减去10元,之后保存到数据库中。
books = BookOrder.objects.all()
for book in books:
book.price -= 10
book.save()
print(connection.queries[-1])
# {
# 'sql': "UPDATE `book_order` SET `book_id` = 1, `price` = 79.0e0, `time` = '2020-02-04 01:22:43.534747' WHERE `book_order`.`id` = 7",
# 'time': '0.047'} return HttpResponse("index2")
如果我们使用F表达式,就可以优化这个流程,他可以不需要先把数据从数据库中提取出来,计算完成后,再保存回去 。他可以直接执行SQL语句,就将员工工资增加2000元。示例代码如下:
from django.db.models import F
from django.http import HttpResponse
from .models import BookOrder # F表达式的用法详解:F表达式并不会真正的到数据库中查询数据,仅仅只是起到一个标识的作用,告诉sql语句目前的值为多少。
def index2(request):
# 2. 将bookorder表中预定价格降低10元
# 注意:调用的是update()方法,可以直接在数据库层面直接调用F表达式更改数据库中的数据信息
BookOrder.objects.update(price=F('price')-10)
# 因为connection.queries返回的是一个包含多个字典的列表,并且只有最后一个字典中的sql语句才是我们代码中执行的sql语句
print(connection.queries[-1])
# {'sql': 'UPDATE `book_order` SET `price` = (`book_order`.`price` - 10)', 'time': '0.125'}
return HttpResponse('indes2')
其中,models.py文件中模型的定义为:
from django.db import models

# 定义图书模型
class Book(models.Model):
name = models.CharField(max_length=100, unique=True)
pages = models.IntegerField()
price = models.FloatField()
rating = models.FloatField()
author = models.ForeignKey('Author', on_delete=models.CASCADE)
publisher = models.ForeignKey('Publisher', on_delete=models.CASCADE) class Meta:
db_table = 'book' def __str__(self):
return "(书名:%s,页数:%s,价格:%s,打折:%s,作者:%s,出版社:%s)" % (self.name, self.pages, self.price, self.rating, self.author, self.publisher) # 定义预定图书的模型
class BookOrder(models.Model):
book = models.ForeignKey('Book', on_delete=models.CASCADE)
price = models.FloatField()
time = models.DateTimeField(auto_now_add=True, null=True) class Meta:
db_table = 'book_order'
F表达式并不会马上从数据库中获取数据,而是在生成sql语句的时候,动态的获取传给F表达式的值。在执行操作之前,数据库中的数据信息如下:

执行操作之后,数据库中信息为:

76.Python中F表达式详解的更多相关文章

  1. python中threading模块详解(一)

    python中threading模块详解(一) 来源 http://blog.chinaunix.net/uid-27571599-id-3484048.html threading提供了一个比thr ...

  2. Python中time模块详解

    Python中time模块详解 在平常的代码中,我们常常需要与时间打交道.在Python中,与时间处理有关的模块就包括:time,datetime以及calendar.这篇文章,主要讲解time模块. ...

  3. 第7.19节 Python中的抽象类详解:abstractmethod、abc与真实子类

    第7.19节 Python中的抽象类详解:abstractmethod.abc与真实子类 一.    引言 前面相关的章节已经介绍过,Python中定义某种类型是以实现了该类型对应的协议为标准的,而不 ...

  4. python中常用模块详解二

    log模块的讲解 Python 使用logging模块记录日志涉及四个主要类,使用官方文档中的概括最为合适: logger提供了应用程序可以直接使用的接口API: handler将(logger创建的 ...

  5. python 中的unicode详解

    通过例子来看问题是比较容易懂的. 首先来看,下面这个是我新建的一个txt文件,名字叫做ivan_utf8.txt,然后里面随便编辑了一些东西. 然后来用控制台打开这个文件,同样也是截图: 这里就是简单 ...

  6. python 中model.py详解

    model详解 Django中遵循 Code Frist 的原则,即:根据代码中定义的类来自动生成数据库表. 创建表 基本结构 from django.db import models # Creat ...

  7. Python中with用法详解

    一 .with语句的原理 上下文管理协议(Context Management Protocol):包含方法 __enter__()和__exit__(),支持该协议的对象要实现这两个方法. 上下文管 ...

  8. python 中的map 详解

    python中的map函数应用于每一个可迭代的项,返回的是一个结果list.如果有其他的可迭代参数传进来,map函数则会把每一个参数都以相应的处理函数进行迭代处理.map()函数接收两个参数,一个是函 ...

  9. 4、Python中的类详解(0601)

    <大话数据结构>的作者程杰在博客园也有博客,网址是:http://cj723.cnblogs.com/ 面向对象编程(OOP) 1.程序 = 指令 + 数据 代码可以选择以指令为核心或以数 ...

随机推荐

  1. Day10:关于桃子的和关于游戏新的设想(顺手做个记录孩子吃喝拉撒的工具)

    公历2015年6月3日~ 北京时间晚上8:42~ 在美中宜和~ 一个叫桃子的小美女出生了! 没错!小桃子终于出生了!真心不容易啊! 6月3日 03:00 AM 老婆推我,叫我起来,她说她肚子疼,还想上 ...

  2. 攻防世界web新手区(3)

    xff_referer:http://111.198.29.45:43071 打开网址,显示出这个页面: X-Forwarded-For:简称XFF头,它代表客户端,也就是HTTP的请求端真实的IP, ...

  3. 侧边栏下拉时箭头的旋转动画(treeView控件)

    //点击菜单时箭头旋转 let treeView = document.getElementsByClassName("treeview");//let解决闭包问题 let las ...

  4. (译)Calculus on Computational Graphs: Backpropagation

    Posted on August 31, 2015 Introduction Backpropagation is the key algorithm that makes training deep ...

  5. sessionManager配置

    在sessionManager配置的时候,有两个属性, 在这个类中,cacheManager是要注入到sessionDao中的,但要求sessionDao实现CacheManagerAware接口 C ...

  6. 【转】Windows中使用TortoiseGit提交项目到GitLab配置

    转  原文地址 https://www.cnblogs.com/xiangwengao/p/4134492.html   下文来给各位介绍Windows中使用TortoiseGit提交项目到GitLa ...

  7. java字符,字符串,数字之间的转换

    string 和int之间的转换 string转换成int  :Integer.valueOf("12") int转换成string : String.valueOf(12) ch ...

  8. 春运到了,带你用python来抢票回家!

    不知不觉,一年一度的春运抢票大幕已经拉开,想快速抢到回家的车票吗?作为程序员,这些技术手段,你一定要知道. 为了让大家更快捷更便利的抢火车票,各种各样的抢票软件应需而生,这类软件大部分都是付费抢票的机 ...

  9. 吴裕雄--天生自然java开发常用类库学习笔记:Iterator接口

    import java.util.List ; import java.util.ArrayList ; import java.util.Iterator ; public class Iterat ...

  10. POJ 1330:Nearest Common Ancestors

    Nearest Common Ancestors Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 20940   Accept ...