定制小程序开发django——ORM常用查询总结

文章目录

视图函数

import jsonimport loggingimport osfrom datetime import datetimefrom django.conf import settingsfrom django.db.models import Q, Ffrom rest_framework import status, filters, mixins, generics, viewsets, permissionsfrom rest_framework.decorators import actionfrom rest_framework.response import Responsefrom configures.models import Configuresfrom envs.models import Envsfrom interfaces.models import Interfacesfrom projects.serializers import ProjectsSerializer, ProjectsNamesSerializer, ProjectsInterfacesSerializer, \    ProjectsRunSerializer, ProjectsNames1Serializerfrom testcases.models import Testcasesfrom testsuites.models import Testsuitsfrom utils import commonlogger=logging.getLogger('mytest')from projects.models import Projectsfrom utils.pagination import PageNumberPaginationclass 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
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48

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()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

执行结果:定制小程序开发定制小程序开发自动化测试平台项目

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()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

查询结果:

<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()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

<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()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

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()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

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()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

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

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()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

执行结果:模型对象
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()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

执行结果: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()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

执行结果: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()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

执行结果:
<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()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

执行结果:
<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()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

执行结果:

<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()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

执行结果:<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()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

执行结果:<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()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

执行结果:<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()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

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()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

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()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

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()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

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()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

执行结果:<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()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

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()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

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()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

执行结果:
<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()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

执行结果:
<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()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

执行结果:{‘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()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

执行结果:

{‘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()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

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()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

执行的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()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

执行的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

网站建设定制开发 软件系统开发定制 定制软件开发 软件开发定制 定制app开发 app开发定制 app开发定制公司 电商商城定制开发 定制小程序开发 定制开发小程序 客户管理系统开发定制 定制网站 定制开发 crm开发定制 开发公司 小程序开发定制 定制软件 收款定制开发 企业网站定制开发 定制化开发 android系统定制开发 定制小程序开发费用 定制设计 专注app软件定制开发 软件开发定制定制 知名网站建设定制 软件定制开发供应商 应用系统定制开发 软件系统定制开发 企业管理系统定制开发 系统定制开发