java8怎么按照两个字段的乘积排序_django-orm F对象的使用 按照两个字段的和,乘积排序实例...

本文介绍了Django ORM中的F对象如何用于复杂的排序操作,如按字段的乘积、和排序,并展示了如何根据关系表的字段进行排序。通过F对象,可以避免不必要的中间字段,直接对数据库进行高效操作。
摘要由CSDN通过智能技术生成

ebb0cd79d49cf6d02b168bc4f5dda777.png

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类是最好的解决方法,这样不必要再添加一个字段了

# 按照总价逆序取前十个

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,这取决于后端数据库。

按照关系表的字段排序

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")

Note: 无论是单下划线还是双下划线,我们都可用{{ content.category.title }}在前端获取到关联表的数据。

以上这篇django-orm F对象的使用 按照两个字段的和,乘积排序实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持云海天教程。

原文链接:https://blog.csdn.net/Buffing/article/details/80849079

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值