一、查询表达式
查询表达式描述可用作于更新,创建,过滤,排序,注释或聚合的一部分的值的计算。这里(文档中)有很多内置表达式可以帮助你完成自己的查询。 表达式可以组合,甚至是嵌套,来完成更加复杂的计算
二、内置表达式
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 |
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 软件产品开发中常见的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