class F
F()是代表模型字段的值,也就是说对于一些特殊的字段的操作,我们不需要数据先取到内存中,然后操作,在存储到db中了。
以下为几个使用的经典场景:
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'))
3.如果说按照两个字段的和,乘积,差进行排序,用F类是最好的解决方法,这样不必要再添加一个字段了
1
2
3
4
5
|
# 按照总价逆序取前十个
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对象支持对数据的算术运算,还有时间比较操作,真的是query利器。
补充知识:Django查询数据库时各种种类的排序
按照entry_date从小到大查询数据,可以写成:
Content.objects.order_by('entry_date')
从大到小排序:
Content.objects.order_by('-entry_date')
下面介绍其他种类的排序
随机排序:
Content.objects.order_by('?')
但是order_by(?)这种方式也许expensive并且slow,这取决于后端数据库。
按照关系表的字段排序
1
2
3
4
5
6
7
|
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)
|
1
2
3
4
5
6
7
8
|
# 按照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' )
|
Note: 无论是单下划线还是双下划线,我们都可用{{ content.category.title }}在前端获取到关联表的数据。
以上这篇django-orm F对象的使用 按照两个字段的和,乘积排序实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持服务器之家。
原文链接:https://blog.csdn.net/Buffing/article/details/80849079