zoukankan      html  css  js  c++  java
  • 76.Python中F表达式详解

    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表达式的值。在执行操作之前,数据库中的数据信息如下:

    在这里插入图片描述

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

    在这里插入图片描述

    始于才华,忠于颜值;每件事情在成功之前,看起来都是天方夜谭。一无所有,就是无所不能。
  • 相关阅读:
    卡特兰数
    hdu 1023 Train Problem II
    hdu 1022 Train Problem
    hdu 1021 Fibonacci Again 找规律
    java大数模板
    gcd
    object dection资源
    Rich feature hierarchies for accurate object detection and semantic segmentation(RCNN)
    softmax sigmoid
    凸优化
  • 原文地址:https://www.cnblogs.com/guyan-2020/p/12259403.html
Copyright © 2011-2022 走看看