随笔 - 195,  文章 - 1,  评论 - 6,  阅读 - 51884

一、查询表达式

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

 

 二、内置表达式

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() - 只有一个

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

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

1
Reporter.objects.all().update(stories_filed=F('stories_filed') + 1)     # 会将所有字段查询出来的值都+1

 

posted on   輪滑少年  阅读(357)  评论(0编辑  收藏  举报
编辑推荐:
· 软件产品开发中常见的10个问题及处理方法
· .NET 原生驾驭 AI 新基建实战系列:向量数据库的应用与畅想
· 从问题排查到源码分析:ActiveMQ消费端频繁日志刷屏的秘密
· 一次Java后端服务间歇性响应慢的问题排查记录
· dotnet 源代码生成器分析器入门
阅读排行:
· ThreeJs-16智慧城市项目(重磅以及未来发展ai)
· .NET 原生驾驭 AI 新基建实战系列(一):向量数据库的应用与畅想
· Ai满嘴顺口溜,想考研?浪费我几个小时
· Browser-use 详细介绍&使用文档
· 软件产品开发中常见的10个问题及处理方法
历史上的今天:
2020-10-09 Django框架之第三篇(路由层)--有名/无名分组、反向解析、路由分发、名称空间、伪静态、图书管理系统表设计
2020-10-09 Django框架之第二篇--app注册、静态文件配置、form表单提交、pycharm链接数据库、Django使用mysql数据库、表字段的增删改查、表数据的增删改查
2020-10-09 初识Django
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示