django——ORM常用查询总结

news/2024/7/5 8:01:54

在这里插入图片描述

文章目录

  • 视图函数
  • 1、get():获取模型对象
  • 2、all():查询所有数据
  • 3、filter():进行过滤,方法中可以传递多个参数
    • 查询项目编号大于等于5的项目有哪些
  • 4、exclude():反向过滤
    • 过滤项目编号不在2到5之间的项目
  • 5、order_by():排序
  • 6、first()
  • 7、last()
  • 8、exists()
  • 9、count()
  • 10、切片操作
  • 11、values()(重点)
  • 12、values_list()(重点)
  • 13、startswith:用于查询以什么字段开头
  • 14、endswith:用于查询以什么字段结尾
  • 15、contains:用于查询包含什么的字段
  • 16、in:用于查询在特定范围的字段
  • 17、not in:用于查询不在特定范围的字段
  • 18、in_range:用于查询在区间范围的字段
  • 19、not in_range:用于查询在区间范围的字段
  • 20、exact:精确查询
  • 21、F:可以实现查询属性与属性之间的关系
    • 查询id属性值大于name属性值的项目
  • 22、Q:实现属性之间(与|或|非)的功能
    • 查询项目编号大于等于5,或者项目名称包含2022的所有项目
  • 23、annotate():分组(有疑问)
    • 例一:
    • 例二:
  • 24、aggregate()
    • 同时获取最大值、最小值、平均值、求和
  • 25、gt、gte、lt、lte:大于、大于等于、小于、小于等于
  • 26、only:只取某列的值(重点)
  • 27、defer:取出除了某列以外其他列的值(重点)

视图函数

import json
import logging
import os
from datetime import datetime

from django.conf import settings
from django.db.models import Q, F
from rest_framework import status, filters, mixins, generics, viewsets, permissions
from rest_framework.decorators import action
from rest_framework.response import Response
from configures.models import Configures
from envs.models import Envs
from interfaces.models import Interfaces
from projects.serializers import ProjectsSerializer, ProjectsNamesSerializer, ProjectsInterfacesSerializer, \
    ProjectsRunSerializer, ProjectsNames1Serializer
from testcases.models import Testcases
from testsuites.models import Testsuits
from utils import common

logger=logging.getLogger('mytest')

from projects.models import Projects
from utils.pagination import PageNumberPagination


class ProjectsViewSet(viewsets.ModelViewSet):
    queryset=Projects.objects.all()
    serializer_class = ProjectsSerializer
    pagination_class = PageNumberPagination


    def get_serializer_class(self):
        elif self.action=='names1':
            return ProjectsNames1Serializer
        else:
            return super().get_serializer_class()

    def paginate_queryset(self, queryset):
        if self.action == 'names1':
            return
        else:
            return super().paginate_queryset(queryset)

    def get_queryset(self):
        if self.action=='names1':

        else:
            return super().get_queryset()

1、get():获取模型对象

get():获取模型对象
如果获取不到,将报错

def get_queryset(self):
        if self.action=='names1':
            print(Projects.objects.get(id=1))
            return Projects.objects.all()
        else:
            return super().get_queryset()

执行结果:自动化测试平台项目

2、all():查询所有数据

Projects.objects.all():获取查询集对象

def get_queryset(self):
        if self.action=='names1':
            print(Projects.objects.all())
            return Projects.objects.all()
        else:
            return super().get_queryset()

查询结果:

<QuerySet [<Projects: 自动化测试平台项目>, <Projects: 前程贷P2P金融项目>, <Projects: 项目4>, <Projects: 项目5>, <Projects: 项目6>, …]>

3、filter():进行过滤,方法中可以传递多个参数

查询项目编号大于等于5的项目有哪些

def get_queryset(self):
        if self.action=='names1':
            print(Projects.objects.filter(id__gte=5))
            return Projects.objects.all()
        else:
            return super().get_queryset()

<QuerySet [<Projects: 项目4>, <Projects: 项目5>, <Projects: 项目6>, <Projects: 2022-5-21-2项目>, <Projects: 2022-5-21-3项目>, …]>

4、exclude():反向过滤

过滤项目编号不在2到5之间的项目

def get_queryset(self):
        if self.action=='names1':
            print(Projects.objects.exclude(id__range=[2,5]))
            return Projects.objects.all()
        else:
            return super().get_queryset()

5、order_by():排序

通过order_by 方法, 前面加"-"就是降序,默认升序
Projects.objects.order_by(‘id’):升序
Projects.objects.order_by(‘-id’):降序
可以多次排序 先按name字段降序,如果name相同,就按id字段升序
Projects.objects.order_by(“-name”,“id”)

def get_queryset(self):
        if self.action=='names1':
            print(Projects.objects.order_by('id'))
            print(Projects.objects.order_by('id'))
            return Projects.objects.all()
        else:
            return super().get_queryset()

6、first()

Projects.objects.all().first():返回模型对象,查找第一个对象

def get_queryset(self):
        if self.action=='names1':
            print(Projects.objects.all().first())
            return Projects.objects.all()
        else:
            return super().get_queryset()

执行结果:模型对象
自动化测试平台项目

7、last()

Projects.objects.all().last():返回模型对象,查找最后一个对象

def get_queryset(self):
        if self.action=='names1':
            print(Projects.objects.all().last())
            return Projects.objects.all()
        else:
            return super().get_queryset()

执行结果:模型对象
2022_8_7_31项目

8、exists()

Projects.objects.filter(id__gte=3).exists():exists():判断查询集中是否有数据,如果有则返回True,没有则返回False。

def get_queryset(self):
        if self.action=='names1':
            print(Projects.objects.filter(id__gte=3).exists())
            return Projects.objects.all()
        else:
            return super().get_queryset()

执行结果:True

9、count()

统计查询集中模型对象的数量,返回的是数字

def get_queryset(self):
        if self.action=='names1':
            print(Projects.objects.filter(id__gte=3).count())
            return Projects.objects.all()
        else:
            return super().get_queryset()

执行结果:49

10、切片操作

同列表操作一致,返回查询集对象
limit 通过索引进行切片[10:20] 代表从10取到20 前闭后开
查询集不支持负数索引:Projects.objects.filter()[-1]

def get_queryset(self):
        if self.action=='names1':
            print(Projects.objects.all()[2:4])
            return Projects.objects.all()
        else:
            return super().get_queryset()

执行结果:
<QuerySet [<Projects: 项目4>, <Projects: 项目5>]>

11、values()(重点)

Projects.objects.values(“name”,“tester”)
返回查询集对象,列表中套字典,只取"name","tester"字段

def get_queryset(self):
        if self.action=='names1':
            print(Projects.objects.values("name","tester"))
            return Projects.objects.all()
        else:
            return super().get_queryset()

执行结果:
<QuerySet [{‘name’: ‘自动化测试平台项目’, ‘tester’: ‘优优’}, {‘name’: ‘前程贷P2P金融项目’, ‘tester’: ‘小可可’}, {‘name’: ‘项目4’, ‘tester’: ‘某人’}, {‘name’: ‘项目5’, ‘tester’: ‘某人’}, {‘name’: ‘项目6’, ‘tester’: ‘某人’},…]>

12、values_list()(重点)

Projects.objects.values_list(“name”,“tester”)
返回查询集对象,列表中套元组,只取"name","tester"字段

def get_queryset(self):
        if self.action=='names1':
            print(Projects.objects.values_list("name","tester"))
            return Projects.objects.all()
        else:
            return super().get_queryset()

执行结果:

<QuerySet [(‘自动化测试平台项目’, ‘优优’), (‘前程贷P2P金融项目’, ‘小可可’), (‘项目4’, ‘某人’), (‘项目5’, ‘某人’), (‘项目6’, ‘某人’), (‘2022-5-21-2项目’, ‘kobe11’), (‘2022-5-21-3项目’, ‘qweq’), (‘2022-5-21-4项目’, ‘12311’), …]>>

13、startswith:用于查询以什么字段开头

where name like “获取%” 代表查询名字以获取开头的所有
name__istartswith 表示不区分大小写,以什么什么为开头
Projects.objects.filter(name__startswith=‘获取’):返回查询集对象

def get_queryset(self):
        if self.action=='names1':
            print(Projects.objects.filter(name__startswith='获取'))
            return Projects.objects.all()
        else:
            return super().get_queryset()

执行结果:<QuerySet [<Projects: 获取总部城市>]>

14、endswith:用于查询以什么字段结尾

where name like “%4” 表示匹配以4结尾的所有单词
name__iendswith 表示不区分大小写,以什么什么为结尾
Projects.objects.filter(name__endswith=‘4’):返回查询集对象

def get_queryset(self):
        if self.action=='names1':
            print(Projects.objects.filter(name__endswith='4'))
            return Projects.objects.all()
        else:
            return super().get_queryset()

执行结果:<QuerySet [<Projects: 项目4>]>

15、contains:用于查询包含什么的字段

where name like “%自动化%” 表示匹配中间有 自动化 字的所有单词
name__icontains 表示不区分大小写,包含什么什么的单词
Projects.objects.filter(name__contains=‘自动化’):返回查询集对象

def get_queryset(self):
        if self.action=='names1':
            print(Projects.objects.filter(name__contains='自动化'))
            return Projects.objects.all()
        else:
            return super().get_queryset()

执行结果:<QuerySet [<Projects: 自动化测试平台项目>]>

16、in:用于查询在特定范围的字段

通过 字段名__in = [1,2] 查询
Projects.objects.filter(id__in=[1,2,3,4,5,6]):返回查询集对象

def get_queryset(self):
        if self.action=='names1':
            print(Projects.objects.filter(id__in=[1,2,3,4,5,6])) 
            return Projects.objects.all()
        else:
            return super().get_queryset()

17、not in:用于查询不在特定范围的字段

Projects.objects.exclude(id__in=[1,2,3,4,5,6]):返回查询集对象

def get_queryset(self):
        if self.action=='names1':
            print(Projects.objects.exclude(id__in=[1,2,3,4,5,6])) 
            return Projects.objects.all()
        else:
            return super().get_queryset()

18、in_range:用于查询在区间范围的字段

between … and… 通过 列名__range = [开始位置,结束位置] 闭区间
Projects.objects.filter(id__range=[2,5]):返回查询集对象

def get_queryset(self):
        if self.action=='names1':
            print(Projects.objects.filter(id__range=[2,5]))  
            return Projects.objects.all()
        else:
            return super().get_queryset()

19、not in_range:用于查询在区间范围的字段

Projects.objects.exclude(id__range=[2,5]):返回查询集对象

def get_queryset(self):
        if self.action=='names1':
            print(Projects.objects.exclude(id__range=[2,5]))  
            return Projects.objects.all()
        else:
            return super().get_queryset()

20、exact:精确查询

Projects.objects.filter(name__exact=‘自动化测试平台项目’):返回查询集对象
iexact:不区分大小写

def get_queryset(self):
        if self.action=='names1':
            print(Projects.objects.filter(name__exact='自动化测试平台项目'))
            return Projects.objects.all()
        else:
            return super().get_queryset()

执行结果:<QuerySet [<Projects: 自动化测试平台项目>]>

21、F:可以实现查询属性与属性之间的关系

查询id属性值大于name属性值的项目

需要导入:from django.db.models import F
Projects.objects.filter(id__gte=F(‘name’))

def get_queryset(self):
        if self.action=='names1':
            print(Projects.objects.filter(id__gte=F('name')))
            return Projects.objects.all()
        else:
            return super().get_queryset()

22、Q:实现属性之间(与|或|非)的功能

需要导入:from django.db.models import Q
Projects.objects.filter(Q(id__gte=5) | Q(name__contains=“2022”))
| 表示 或
& 表示 与

查询项目编号大于等于5,或者项目名称包含2022的所有项目

def get_queryset(self):
        if self.action=='names1':
            print(Projects.objects.filter(Q(id__gte=5) | Q(name__contains="2022")))
            return Projects.objects.all()
        else:
            return super().get_queryset()

23、annotate():分组(有疑问)

需要导入:from django.db.models import Count,Max,Min,Sum

如果你想要对数据集先进行分组然后再进行某些聚合操作或排序时,需要使用annotate方法来实现。与aggregate方法不同的是,annotate方法返回结果的不仅仅是含有统计结果的一个字典,而是包含有新增统计字段的查询集(queryset).

print(Projects.objects.values(“name”).annotate(Count(“id”))):表示对name字段进行分组,分组后对id进行统计

例一:

def get_queryset(self):
        if self.action=='names1':
            print(Projects.objects.values("leader").annotate(Count("id")))
            return Projects.objects.all()
        else:
            return super().get_queryset()

执行结果:
<QuerySet [{‘leader’: ‘可可’, ‘id__count’: 1}, {‘leader’: ‘可优’, ‘id__count’: 1}, {‘leader’: ‘某人’, ‘id__count’: 1}, {‘leader’: ‘某人’, ‘id__count’: 1}, {‘leader’: ‘某人’, ‘id__count’: 1}, {‘leader’: ‘kobe11’, ‘id__count’: 1}, …]>

例二:

先查询项目编号大于等于5
接着以id、name、tester进行分组
分组后按照tester进行统计

def get_queryset(self):
        if self.action=='names1':
            querys=Projects.objects.filter(id__gte=5).values('id','name','tester').annotate(Count("tester"))
            print(querys)
            return Projects.objects.all()
        else:
            return super().get_queryset()

执行结果:
<QuerySet [{‘id’: 11, ‘name’: ‘项目4’, ‘tester’: ‘某人’, ‘tester__count’: 1}, {‘id’: 12, ‘name’: ‘项目5’, ‘tester’: ‘某人’, ‘tester__count’: 1}, {‘id’: 13, ‘name’: ‘项目6’, ‘tester’: ‘某人’, ‘tester__count’: 1}, …']>

24、aggregate()

aggregate的中文意思是聚合, 源于SQL的聚合函数。Django的aggregate()方法作用是对一组值(比如queryset的某个字段)进行统计计算,并以字典(Dict)格式返回统计计算结果。django的aggregate方法支持的聚合操作有AVG / COUNT / MAX / MIN /SUM 等。

需要导入:from django.db.models import Count,Max,Min,Sum

def get_queryset(self):
        if self.action=='names1':
            print(Projects.objects.aggregate(Count("id")))
            return Projects.objects.all()
        else:
            return super().get_queryset()

执行结果:{‘tester__count’: 49}

其他结果为:

{‘tester__sum’: 49}
{‘tester__max’: 49}
{‘tester__min’: 49}
{‘tester__avg’: 49}

同时获取最大值、最小值、平均值、求和

def get_queryset(self):
        if self.action=='names1':
            print(Projects.objects.aggregate(Count("tester"),Max('tester'),Min('tester'),Avg('tester'),Sum('tester')))
            return Projects.objects.all()
        else:
            return super().get_queryset()

执行结果:

{‘tester__count’: 49, ‘tester__max’: ‘小姐姐’, ‘tester__min’: ‘12311’, ‘tester__avg’: 2763.9591836734694, ‘tester__sum’: 135434.0}

25、gt、gte、lt、lte:大于、大于等于、小于、小于等于

def get_queryset(self):
        if self.action=='names1':
            print(Projects.objects.filter(id__gt=1))
            print(Projects.objects.filter(id__gte=1))
            print(Projects.objects.filter(id__lt=5))
            print(Projects.objects.filter(id__lte=5))
            return Projects.objects.all()
        else:
            return super().get_queryset()

26、only:只取某列的值(重点)

p=Projects.objects.only(“tester”,“name”)
查询tester和name字段不会走数据库,走的是查询集
查询其他字段,会重新走数据库查询;
而p=Projects.objects.all()就不用走数据库查询了

def get_queryset(self):
        if self.action=='names3':
            p=Projects.objects.only("tester","name")
            print(p)
            return Projects.objects.only("tester","name")
        else:
            return super().get_queryset()

执行的sql语句为:
在这里插入图片描述

27、defer:取出除了某列以外其他列的值(重点)

p=Projects.objects.defer(“tester”,“name”)
defer括号内放的字段不在查询出来的对象里面,查询该字段需要重新走数据
而如果查询的是非括号内的字段 则不需要走数据库了

def get_queryset(self):
        if self.action=='names3':
            p=Projects.objects.defer("tester","name")
            print(p)
            return Projects.objects.defer("tester","name")
        else:
            return super().get_queryset()

执行的sql语句为:

SELECT “tb_projects”.“id”, “tb_projects”.“create_time”, “tb_projects”.“update_time”, “tb_projects”.“is_delete”, “tb_projects”.“leader”, “tb_projects”.“programmer”, “tb_projects”.“publish_app”, “tb_projects”.“desc” FROM “tb_projects” ORDER BY “tb_projects”.“id” ASC

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述


http://lihuaxi.xjx100.cn/news/1615920.html

相关文章

天堂2服务器安装教程

我们在架设游戏的时候很多时候都是摸不着头脑不知道从何下手&#xff0c;只要我们理清思路一步一步的操作步骤是不难的&#xff0c;其中的细节注意到就能成功的架设起来。下面跟大家来说说从哪下手。 首先我们需要有自己的服务器&#xff0c;系统我们就用Windows 2008 Server。…

VBA_MF系列技术资料1-202

MF系列VBA技术资料 为了让广大学员在VBA编程中有切实可行的思路及有效的提高自己的编程技巧&#xff0c;我参考大量的资料&#xff0c;并结合自己的经验总结了这份MF系列VBA技术综合资料&#xff0c;而且开放源码&#xff08;MF04除外&#xff09;&#xff0c;其中MF01-04属于定…

springboot校园二手书交易管理系统35

大家好✌&#xff01;我是CZ淡陌。一名专注以理论为基础实战为主的技术博主&#xff0c;将再这里为大家分享优质的实战项目&#xff0c;本人在Java毕业设计领域有多年的经验&#xff0c;陆续会更新更多优质的Java实战项目&#xff0c;希望你能有所收获&#xff0c;少走一些弯路…

CakePHP 3.x/4.x反序列化RCE链

最近网上公开了cakephp一些反序列化链的细节&#xff0c;但是没有公开poc&#xff0c;并且网上关于cakephp的反序列化链比较少&#xff0c;于是自己跟一下 &#xff0c;构造pop链。 CakePHP简介 CakePHP是一个运用了诸如ActiveRecord、Association Data Mapping、Front Contr…

计算机网络传输层知识总结·

传输层提供的服务 传输层的功能 ●传输层提供进程之间的逻辑通信&#xff0c;即端到端的通信 ●复用和分用 ●差错检测&#xff08;首部和数据部分&#xff09; ●面向连接的TCP和无连接的UDP 端口的作用 ●端口标识的是主机中的进程 ●硬件端口是不同…

四、RIP动态路由实验

拓扑图&#xff1a; 基本ip的配置已经配置好了&#xff0c;接下来对两台路由器配置rip协议&#xff0c;两台PC进行跨网段通讯 RIPv1版本只能识别ABC的大类网段&#xff0c;不能区分子网掩码&#xff0c;v2版本可以识别子网掩码 首先进入R1&#xff0c;进入rip&#xff0c;宣告…

《UnityShader入门精要》学习3

笛卡尔坐标系&#xff08;Cartesian Coordinate System&#xff09; 二维笛卡儿坐标系 一个二维的笛卡儿坐标系包含了两个部分的信息&#xff1a; 一个特殊的位置&#xff0c;即原点&#xff0c;它是整个坐标系的中心。两条过原点的互相垂直的矢量&#xff0c;即x轴和y轴。这…

【UE 插件】UE4 虚幻引擎 插件开发(带源码插件打包、无源码插件打包) 有这一篇文章就够了!!!

目录 0 引言1 快速入门1.1 新建插件的前提1.2 创建插件步骤1.3 打包插件 2 无源代码的插件制作3 插件详细介绍3.1 插件的使用方法3.1 UE 预置插件模版3.1.1 空白3.1.2 纯内容3.1.3 编辑器独立窗口3.1.4 编辑器工具栏按钮3.1.5 编辑器模式3.1.6 第三方库3.1.7 蓝图库 3.2 插件中…