django-orm F对象的使用 按照两个字段的和,乘积排序实例

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对象的使用 按照两个字段的和,乘积排序实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • Django ORM filter() 的运用详解

    最近发布代码的时候,遇到一个问题,发现Python中eval()函数的危险性.然而我还是个菜鸟,其中有一段代码是这样的. queryset = eval("models.TUserInfo.objects.filter({0})[{1}:{2}]".format(select,page_num * page - page_num,page_num * page)) 代码场景: 这是一个获取信息的API.所以需要去数据库里取对应信息,但是你不知道获取信息是根据哪几个字段而来,需要靠用户传

  • Django中对数据查询结果进行排序的方法

    在你的 Django 应用中,你或许希望根据某字段的值对检索结果排序,比如说,按字母顺序. 那么,使用 order_by() 这个方法就可以搞定了. >>> Publisher.objects.order_by("name") [<Publisher: Apress>, <Publisher: O'Reilly>] 跟以前的 all() 例子差不多,SQL语句里多了指定排序的部分: SELECT id, name, address, city,

  • python按照多个条件排序的方法

    对tuple进行排序,先按照第一个元素升序,如果第一个元素相同,再按照第二个元素降序排列. L = [(12, 12), (34, 13), (32, 15), (12, 24), (32, 64), (32, 11)] L.sort(key=lambda x: (x[0], -x[1])) print(L) 结果: [(12, 24), (12, 12), (32, 64), (32, 15), (32, 11), (34, 13)] 以上这篇python按照多个条件排序的方法就是小编分享给大

  • python实现对象列表根据某个属性排序的方法详解

    本文实例讲述了python实现对象列表根据某个属性排序的方法.分享给大家供大家参考,具体如下: 对于一个已有的python list, 里面的内容是一些对象,这些对象有一些相同的属性值, 在一些特定的情况下,需要自己选择特定的排序,也就是根据某一个具体的属性来排序,在网上找了下资料,一般来说有两种方法,但从根本上来说,还是调用了list.sort 方法来实现.下面是简单的测试代码片段: #coding:utf-8 class Person: def __init__(self,name,age,

  • django-orm F对象的使用 按照两个字段的和,乘积排序实例

    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 dja

  • Django中Q查询及Q()对象 F查询及F()对象用法

    Django Q/F #1 环境 Python3.7.3 Django==2.0.6 #2 开始 #2.1 django F()表达式 每次获取times当前的值,再+1,这样需要将times值取出,存到内存中 obj = models.Test.objects.get(name="cox") obj.times = obj.times + 1 obj.save() 虽然 obj.times = F("times") + 1 看起来像常规的Python为实例属性赋值

  • django中F与Q查询的使用

    目录 F查询 Q查询 事务 其他鲜为人知的操作 Django ORM执行原生SQL QuerySet方法大全 F查询 在上面所有的例子中,我们构造的过滤器都只是将字段值与某个我们自己设定的常量做比较.如果我们要对两个字段的值做比较,那该怎么做呢? Django 提供 F() 来做这样的比较.F() 的实例可以在查询中引用字段,来比较同一个 model 实例中两个不同字段的值. 示例1: 查询出卖出数大于库存数的商品 from django.db.models import F ret1=mode

  • Django中F函数的使用示例代码详解

    F()函数 F()函数的导入 from django.db.models import F 为什么要使用F()函数? 一个 F()对象代表了一个model的字段值或注释列.使用它就可以直接参考model的field和执行数据库操作而不用再把它们(model field)查询出来放到python内存中. 开发个人博客时,统计每篇文章浏览量的逻辑通常是这样写的: post = Post.objects.get(...) post.views += 1 post.save() 上面的语句已经相当简短了

  • django 利用Q对象与F对象进行查询的实现

    Q对象: 优势:可以实现 与|或|非 组合查询. 给几个小例子就一目了然了: Book.objects.filter(id__gt=2,bread__gt=20) #and关系 Book.objects.filter(Q(bread__gt=20) & Q(id__gt=2)) #and关系 Book.objects.filter(Q(bread__gt=20) | Q(id__gt=2)) #or关系 Book.objects.filter.(~Q(id=3)) # ~表示not,查询编号不等

  • django使用F方法更新一个对象多个对象字段的实现

    通常情况下我们在更新数据时需要先从数据库里将原数据取出后放在内存里,然后编辑某些字段或属性,最后提交更新数据库.使用F方法则可以帮助我们避免将所有数据先载入内存,而是直接生成SQL语句更新数据库. 假如我们需要对所有产品的价格涨20%,我们通常做法如下.当产品很少的时候,对网站性能没影响.但如果产品数量非常多,把它们信息全部先载入内存会造成很大性能浪费. products = Product.objects.all() for product in products: product.price

  • django ORM之values和annotate使用详解

    任务需求:项目中有个问题表,存储所有的问题,以_id为编号,由于_id未做唯一校验,所以早期数据有多个问题使用同一编号的情况. 需求就是找出编号有重复的数据,只保留第一个 开始之前 使用了values和annotate两个函数 简单的来说values可以理解成展示models指定列的值 annotate起到了group by的作用, 所以我做的事就是对指定字段按个数进行统计,然后留下重复编号的数据,进行清洗 看看数据库数据 查看每条数据的_id的值 对_id数据条数进行统计 转换数据格式为lis

  • 详解Django ORM引发的数据库N+1性能问题

    背景描述 最近在使用 Django 时,发现当调用 api 后,在数据库同一个进程下的事务中,出现了大量的数据库查询语句.调查后发现,是由于 Django ORM 的机制所引起. Django Object-Relational Mapper(ORM)作为 Django 比较受欢迎的特性,在开发中被大量使用.我们可以通过它和数据库进行交互,实现 DDL 和 DML 操作. 具体来说,就是使用 QuerySet 对象来检索数据, 而 QuerySet 本质上是通过在预先定义好的 model 中的

  • Django ORM 多表查询示例代码

    目录 数据准备 正向查询与反向查询 基于对象的跨表查询 正向查询 一对多 多对多 一对一 反向查询 一对多 多对多 一对一 正向查询 反向查询 基于双下线的跨表查询 正向查询 一对一 一对多 多对多 反向查询 一对一 一对多 双下高阶正反向查询 使用filter()的双下线查询 连续跨多张表查询 数据准备 moduls.py # 构建表结构 from django.db import models # 表app01_publish class Publish(models.Model): nam

  • 基于Django ORM、一对一、一对多、多对多的全面讲解

    上篇博客也提到这些知识点,可能大家还是不太清楚,这篇博客为大家详细讲解ORM中的几个知识点 1.1首先我们先看一个小案例: #_*_coding:utf-8_*_ from django.db import models # Create your models here. class Colors(models.Model): colors=models.CharField(max_length=10) #蓝色 def __str__(self): return self.colors cla

随机推荐