首页 > 其他分享 >F查询与Q查询

F查询与Q查询

时间:2023-05-25 20:00:28浏览次数:29  
标签:__ objects models age nid 查询 Book

F查询与Q查询

1、 aggregate

若想把整张表当成一个组来使用聚合函数,应该调用aggregate

# 1、先导入聚合函数
from django.db.models import Max, Min, Avg, Sum, Count
"""
小窍门:
只要是跟数据库相关的模块基本都在django.db.models里面
如果没有那么应该在django.db里
"""

# 2、查询所有作者的最大nid、最小年龄、平均年龄、年龄之和、作者个数

res = Author.objects.aggregate(
        Max("age"),
        Min("age"), 
        Avg("age"), 
        Sum("age"), 
        Count("nid")
    )

print(res)  # 调用的sql为:select avg("age"),max("nid"),... from app01_author;
{'age__max': 30, 'age__min': 10, 'age__avg': 20.0, 'age__sum': 60, 'nid__count': 3}

# 3、也可以指定key值
res = Author.objects.aggregate(
        x=Max("age"),
        y=Min("age"),
    )
print(res) 
{'x': 30, 'y': 10}

2、F查询

F查询够帮你直接获取到表中的某个字段对应的值,具体应用如下

# 修改模型Book增加阅读数与评论数字段,然后重新迁移数据库,新增好记录
class Book(models.Model):
    nid = models.AutoField(primary_key=True)
    name = models.CharField(max_length=32)
    price = models.DecimalField(max_digits=5, decimal_places=2)
    publish_date = models.DateField(auto_now_add=True)
    # 阅读数
    read_num=models.IntegerField(default=0)
    # 评论数
    comment_num=models.IntegerField(default=0)

    publish = models.ForeignKey(to='Publish',to_field='nid',on_delete=models.CASCADE)
    authors=models.ManyToManyField(to='Author')
    def __str__(self):
        return self.name

    
from django.db.models import F
# 1、查询阅评论数大于阅读数的书籍名
res = Book.objects.filter(comment_num__gt=F("read_num"))
print(res)

# 2、将所有书的价格在原来的基础上增加50元
Book.objects.update(price=F("price")+50)

注意,针对数字运算,F可以直接与数字进行数学运算,但如果我们想拼接字符串,则需要引入Concat并配合Value一起实现,如下

# 3、将所有书籍的名称后面加爆款两个字
from django.db.models.functions import Concat
from django.db.models import Value, F

Book.objects.update(name=Concat(F('name'), Value("爆款")))
# Book.objects.update(name=F('name') + "爆款")  # 错误,所有书的名字都会被改为0

3、Q查询

对于filter()方法内逗号分隔开的多个条件,都是and关系,如果想用or或者not关系,则需要使用Q

from django.db.models import Q

Book.objects.filter(Q(nid__gte=3), Q(nid__lte=5))  # 还是and关系
Book.objects.filter(Q(nid__lte=3) | Q(nid__gte=5))  # or关系

Book.objects.filter(~Q(nid__gt=2))  # ~ 等同于在条件前加了not  代表: ! nid>2即nid<=2
Book.objects.filter(~Q(nid__gt=2) | Q(nid__gte=5))  #  代表nid<=2 or nid>=5

Q查询的高阶用法:能够以字符串作为查询字段

q = Q()
q.children.append(('nid__gt', 2))  # 条件中引用的字段为字符串类型
q.children.append(('price__lt', 50))
res = Book.objects.filter(q)  # filter内可以直接放q对象,默认还是and关系
print(res)


q = Q()
q.connector = 'or'
q.children.append(('nid__lte', 2))
q.children.append(('nid__gte', 5))
res = Book.objects.filter(q)  # 此时是or关系
print(res)

# 那什么场景下,我们查询条件中的字段是字符串类型呢?
# 比如我们制作一个搜索功能,我们需要根据用户输入搜索字段完成查询,而用户输入的都是字符串类型,此时就用到了Q的高阶用法

标签:__,objects,models,age,nid,查询,Book
From: https://www.cnblogs.com/yedayangboke/p/17432713.html

相关文章

  • ORACLE表空间使用量查询SQL
    SELECTUpper(F.TABLESPACE_NAME)AS表空间名,round(D.TOT_GROOTTE_MB/1024,2)AS"总大小(G)",round((D.TOT_GROOTTE_MB-F.TOTAL_BYTES)/1024,2)AS"已使用空间(G)",round(F.TOTAL_BYTES/1024,2)AS"空闲空间(G)",R......
  • 星座运势查询接口
    接入点说明:十二星座为:白羊座、金牛座、双子座、巨蟹座、狮子座、处女座、天秤座、天蝎座、射手座、摩羯座、水瓶座、双鱼座。接口地址:https://route.showapi.com/872-1?showapi_appid=&showapi_sign=  查看密匙返回格式:json  纯java:publicstaticvoidm......
  • Elasticsearch 之 join 关联查询及使用场景
    在Elasticsearch这样的分布式系统中执行类似SQL的join连接是代价是比较大的,然而,Elasticsearch却给我们提供了基于水平扩展的两种连接形式。这句话摘自Elasticsearch官网,从“然而”来看,说明某些场景某些情况下我们还是可以使用的一、join总述1、关系类比在关系型数据库中,以MySQ......
  • 报错问题:谷粒商城关于pubsub、publish报错,无法发送查询品牌信息的请求
    1、npminstall--savepubsub-js2、在src下的main.js中引用:①importPubSubfrom'pubsub-js'②Vue.prototype.PubSub=PubSub ......
  • SQL Server:分页查询
    一、分页查询❓需求描述:客户端查询数据库数据并显示在表格中。在数据库中进行一次查询,查询结果有1050条记录,但表格row上限:100,这时需要给本次查询记录分配?页用来显示?可以通过固定公式进行计算(c伪代码):#defineTABLE_SHOW_ROW100//在大学学生表student中查询年龄小于19......
  • Mysql表查询加强
    1. mysql 表查询--加强  7681.1 基本介绍在前面我们讲过mysq|表的基本查询,但是都是对一张表进行的查询,这在实际的软件开发中,还远远的不够。下面我们讲解的过程中,将使用前面创建三张表(emp,dept,salgrade)为大家演示如何进行多表查询1.2使用where子句  案例演示  768?如何......
  • Elasticsearch之join关联查询及使用场景 | 京东云技术团队
    在Elasticsearch这样的分布式系统中执行类似SQL的join连接是代价是比较大的,然而,Elasticsearch却给我们提供了基于水平扩展的两种连接形式。这句话摘自Elasticsearch官网,从“然而”来看,说明某些场景某些情况下我们还是可以使用的一、join总述1、关系类比在关系型数据库中,以MySQL为......
  • 基于Expression Lambda表达式树的通用复杂动态查询构建器——《构思篇一》
    在上一篇中构思了把查询子句描述出来的数据结构,那么能否用代码将其表达出来,如何表达呢?再次回顾考察,看下面的查询子句:Id>1andId<10如上所示,有两个独立的条件分别为Id>1和Id<10,用一个逻辑操作符and连接起来。再看下面这条,后面也是两个独立条件通过操作符or连接,并包在括号......
  • Mybatis多表查询(一对多)
    1、两个实体类(部门表、员工表)一个部门包含许多员工(一对多关系),将员工表信息写到部门实体类中点击查看代码packagecom.bh.po;importjava.util.Set;publicclassDept{privateintdeptno;privateStringdname;privateStringloc;//因为一个部门有很多......
  • SQL Lesson 3: 条件查询(constraints) (Pt. 2)
    http://xuesql.cn/lesson/select_queries_with_constraints_pt_2--请输入sql--SELECT*FROMmovies;--select*frommovieswheretitlelike"ToyStory%";--like用法--select*frommovieswhereDirectornotlike"JohnLasseter";--notlike--s......