前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Django小技巧13: 使用F()表达式

Django小技巧13: 使用F()表达式

作者头像
用户1416054
发布2018-12-04 16:58:51
1.8K0
发布2018-12-04 16:58:51
举报
文章被收录于专栏:JackeyGao的博客JackeyGao的博客

翻译整理自: simpleisbetterthancomplex.com

在 Django QuerySets API 中, F() 用于直接在数据库中引用模型的值。假设你有一个带有price的 Product 模型, 你希望为所有的Product的价格上涨20%.

一个可以实现在解决方案:

Python

代码语言:javascript
复制
products = Product.objects.all()
for product in products:
    product.price *= 1.2
    product.save()

相反, 你可以在单个查询中更新price.

Python

代码语言:javascript
复制
from django.db.models import F

Product.objects.update(price=F('price') * 1.2)

你也可以对单个对象执行这个操作:

Python

代码语言:javascript
复制
product = Product.objects.get(pk=5009)
product.price = F('price') * 1.2
product.save()

要注意, 保存模型后, F()对象依然存在.

Python

代码语言:javascript
复制
product.price                   # price = Decimal('10.00')
product.price = F('price') + 1
product.save()                  # price = Decimal('11.00')
product.name = 'What the F()'
product.save()                  # price = Decimal('12.00')

所以, 在更新这样的字段后, product.price实际上保存的是django.db.models.expressions.CombinedExpression实例, 而不是实际结果。

如果要立即访问结果:

Python

代码语言:javascript
复制
product.price = F('price') + 1
product.save()
print(product.price)            # <CombinedExpression: F(price) + Value(1)>
product.refresh_from_db()
print(product.price)            # Decimal('13.00')

你可以使用F()实现annotate功能:

Python

代码语言:javascript
复制
from django.db.models import ExpressionWrapper, DecimalField

Product.objects.all().annotate(
    value_in_stock=ExpressionWrapper(
        F('price') * F('stock'), output_field=DecimalField()
    )
)

由于price是DecimalField, 而stock是IntegerField,我们需要将表达式包装在ExpressionWrapper中.

也可以用来过滤数据:

Python

代码语言:javascript
复制
Product.objects.filter(stock__gte=F('ordered'))
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档