zoukankan      html  css  js  c++  java
  • django Queryset 中annotate() 查询表达式1

    一、查询表达式

    查询表达式描述可用作于更新,创建,过滤,排序,注释或聚合的一部分的值的计算。这里(文档中)有很多内置表达式可以帮助你完成自己的查询。 表达式可以组合,甚至是嵌套,来完成更加复杂的计算

     

     二、内置表达式

    F() 表达式

    一个 F()对象代表了一个model的字段值或注释列。 使用它就可以直接参考model的field和执行数据库操作而不用再把它们(model field)查询出来放到python内存中。

    相反,Django使用F()对象生成描述数据库级所需操作的SQL表达式。

    eg:

    我们把 reporter.stories_filed 的值从数据库取出放到内存中并用我们熟悉的python运算符操作它,最后再把它保存到数据库
    # Tintin filed a news story! reporter = Reporters.objects.get(name='Tintin') reporter.stories_filed += 1 reporter.save()
    使用F()
    from django.db.models import F
    
    reporter = Reporters.objects.get(name='Tintin')
    reporter.stories_filed = F('stories_filed') + 1
    reporter.save()

    虽然reporter.stories_filed F('stories_filed') 1看起来像一个正常的Python分配值赋给一个实例属性,事实上这是一个描述数据库操作的SQL概念

    当Django遇到一个F()的实例时,它会覆盖标准的Python运算符来创建封装的SQL表达式;在这种情况下,指示数据库增加由reporter.stories_filed表示的数据库字段。

    无论reporter.stories_filed的值是或曾是什么,Python一无所知--这完全是由数据库去处理的。 所有的Python,通过Django的F() 类,只是去创建SQL语法参考字段和描述操作。

    要访问以这种方式保存的新值,必须重新加载该对象

     







    F()可以在对象实例的QuerySets上使用,通过update() 。 这减少了我们上面使用的两个查询 -get()save() - 只有一个

    reporter = Reporters.objects.filter(name='Tintin')
    reporter.update(stories_filed=F('stories_filed') + 1)
    

    我们可以使用update()方法批量地增加多个对象的字段值。这比先从数据库查询后,通过循环一个个增加,并一个个保存要快的很多。

    Reporter.objects.all().update(stories_filed=F('stories_filed') + 1)     # 会将所有字段查询出来的值都+1
    
  • 相关阅读:
    51nod1278 相离的圆
    CodeForces
    SPOJ
    51nod 1040(欧拉函数)
    51nod1009 51nod1042(数位dp)
    51nod1264 线段相交
    51nod1050 循环数组最大子段和
    Spark SQL UDF示例
    Spark SQL官网阅读笔记
    Spark RDD
  • 原文地址:https://www.cnblogs.com/ltyc/p/15269114.html
Copyright © 2011-2022 走看看