django-orm F对象的使用 按照两个字段的和,乘积排序实例
classF
F()是代表模型字段的值,也就是说对于一些特殊的字段的操作,我们不需要数据先取到内存中,然后操作,在存储到db中了。
以下为几个使用的经典场景:
1.统计点击量,点赞(每次加1)
fromdjango.db.modelsimportF
Reporters.objects.filter(id=case_id).update(thumb_num=F('thumb_num')+1)
2.一个合同字段,结束日期和终止日期的比较很容易实现终止日期小于结束日期
fromdjango.db.modelsimportF
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,这取决于后端数据库。
按照关系表的字段排序
classCategory(Base): code=models.CharField(primary_key=True,max_length=100) title=models.CharField(max_length=255) classContent(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-ormF对象的使用按照两个字段的和,乘积排序实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。