django——ORM常用查询总结_orm 取结果中的最大

查询结果:

<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进行统计

例一:

最后我们该如何学习?

1、看视频进行系统学习

这几年的Crud经历,让我明白自己真的算是菜鸡中的战斗机,也正因为Crud,导致自己技术比较零散,也不够深入不够系统,所以重新进行学习是很有必要的。我差的是系统知识,差的结构框架和思路,所以通过视频来学习,效果更好,也更全面。关于视频学习,个人可以推荐去B站进行学习,B站上有很多学习视频,唯一的缺点就是免费的容易过时。

另外,我自己也珍藏了好几套视频资料躺在网盘里,有需要的我也可以分享给你:

1年半经验,2本学历,Curd背景,竟给30K,我的美团Offer终于来了

2、读源码,看实战笔记,学习大神思路

“编程语言是程序员的表达的方式,而架构是程序员对世界的认知”。所以,程序员要想快速认知并学习架构,读源码是必不可少的。阅读源码,是解决问题 + 理解事物,更重要的:看到源码背后的想法;程序员说:读万行源码,行万种实践。

Spring源码深度解析:

1年半经验,2本学历,Curd背景,竟给30K,我的美团Offer终于来了

Mybatis 3源码深度解析:

1年半经验,2本学历,Curd背景,竟给30K,我的美团Offer终于来了

Redis学习笔记:

1年半经验,2本学历,Curd背景,竟给30K,我的美团Offer终于来了

Spring Boot核心技术-笔记:

1年半经验,2本学历,Curd背景,竟给30K,我的美团Offer终于来了

3、面试前夕,刷题冲刺

面试的前一周时间内,就可以开始刷题冲刺了。请记住,刷题的时候,技术的优先,算法的看些基本的,比如排序等即可,而智力题,除非是校招,否则一般不怎么会问。

关于面试刷题,我个人也准备了一套系统的面试题,帮助你举一反三:

1年半经验,2本学历,Curd背景,竟给30K,我的美团Offer终于来了

只有技术过硬,在哪儿都不愁就业,“万般带不去,唯有业随身”学习本来就不是在课堂那几年说了算,而是在人生的旅途中不间断的事情。

人生短暂,别稀里糊涂的活一辈子,不要将就。

读源码是必不可少的。阅读源码,是解决问题 + 理解事物,更重要的:看到源码背后的想法;程序员说:读万行源码,行万种实践。

Spring源码深度解析:

[外链图片转存中…(img-GRkW4yXv-1714285220380)]

Mybatis 3源码深度解析:

[外链图片转存中…(img-m2WWPI9p-1714285220381)]

Redis学习笔记:

[外链图片转存中…(img-MAMOYlZJ-1714285220381)]

Spring Boot核心技术-笔记:

[外链图片转存中…(img-aZi8orVx-1714285220381)]

3、面试前夕,刷题冲刺

面试的前一周时间内,就可以开始刷题冲刺了。请记住,刷题的时候,技术的优先,算法的看些基本的,比如排序等即可,而智力题,除非是校招,否则一般不怎么会问。

关于面试刷题,我个人也准备了一套系统的面试题,帮助你举一反三:

[外链图片转存中…(img-6KPQLukf-1714285220381)]

只有技术过硬,在哪儿都不愁就业,“万般带不去,唯有业随身”学习本来就不是在课堂那几年说了算,而是在人生的旅途中不间断的事情。

人生短暂,别稀里糊涂的活一辈子,不要将就。

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

  • 24
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值