Django ORM F对象实战:字段运算与多条件排序详解
本文深入解析Django ORM中F对象的核心用法。通过实例演示如何利用F对象进行字段值的原子加减、比较及乘积排序,避免内存读写开销。同时涵盖常规排序、随机排序及关联表字段排序等多种场景,提供高效的数据查询方案。
Django F对象基础与原子更新
F对象
F() 用于表示模型中特定字段的当前值。其核心价值在于,对于涉及字段值的特殊操作,无需先将数据加载至内存进行计算再写回数据库,而是直接在数据库层面完成处理。
以下是几个典型的应用场景:
1. 统计点击量或点赞数(每次递增1)
from django.db.models import F Reporters.objects.filter(id=case_id).update(thumb_num=F('thumb_num') + 1)
2. 比较合同字段:轻松实现终止日期小于结束日期的筛选
from django.db.models import F
contract_list = Contracts.objects.filter(contract_stop_time__lt=F('contract_end_time'))
基于F对象的复杂排序应用
3. 若需按两个字段的和、乘积或差值进行排序,使用 F 类是最佳方案,无需额外添加计算字段。
# 按照总价逆序取前十个
goods_list = Goods.objects.all( ).order_by( F('num') * F('unit_price') ).reversed( )[ :10]
# 按照点赞与评论数和进行排序
hot_list = Article.objects.all( ).order_by( F('thumb_num') + F('comment_num') ).reversed( )
综上所述,F 对象支持对数据进行算术运算及时间比较操作,是提升查询效率的利器。
Django数据库查询的其他排序方式
补充知识:Django 数据库查询中的多种排序方式
若需按 entry_date 从小到大查询数据,可编写如下代码:
Content.objects.order_by('entry_date')
若需从大到小排序:
Content.objects.order_by('-entry_date')
以下介绍其他类型的排序方法
随机排序:
Content.objects.order_by('?')
需要注意的是,order_by('?') 这种方式可能开销较大且速度较慢,具体表现取决于后端数据库的实现。
按关系表的字段进行排序
class Category(Base):
code = models.CharField(primary_key=True,max_length=100)
title = models.CharField(max_length = 255)
class Content(Base):
title = models.CharField(max_length=255)
description = models.TextField()
category = models.ForeignKey(Category, on_delete=models.CASCADE)
# 按照Category的字段code,对Content进行排序,只需要外键后加双下划线
Content.objects.order_by('category__title')
# 如果只是按照外键来排序,会默认按照关联的表的主键排序
Content.objects.order_by('category')
# 上面等价于
Content.objects.order_by('category__code')
# 双下划线返回的是join后的结果集,而单下划线返回的是单个表的集合
Content.objects.order_by('category_title')
注意:无论是单下划线还是双下划线,均可在前端通过 {{ content.category.title }} 获取关联表的数据。
以上关于 django-orm F 对象的使用及按两个字段的和、乘积排序的实例分享完毕,希望能对大家有所帮助,欢迎支持本站。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









