开发者社区> dahezhiquan> 正文

Django ORM Model的基本查询操作API

简介: 1.创建Model实例对象 阅读文本前请参考此文章的数据表结构 使用save方法创建Model实例: 由于Topic需要一个User对象,所以,先获取username是admin(超级用户)的User对象,再去创建Topic对象
+关注继续查看


1.创建Model实例对象


阅读文本前请参考此文章的数据表结构

使用save方法创建Model实例:

由于Topic需要一个User对象,所以,先获取username是admin(超级用户)的User对象,再去创建Topic对象


user = User.objects.get(username='admin')
topic = Topic(title='大中国', content='祖国万岁!', user=user)
topic.save()


2.返回单实例的查询方法


使用get查询:


topic = Topic.objects.get(id=1, title=u'大中国')
return HttpResponse("Hello World!" + topic.content)


image


使用get_or_create查询:


如果查询的实例不存在,get_or_create方法会创建新的实例对象


与get不同的是,它返回的是一个tuple对象,即(object,created)。其中第一个元素是实例对象,第二个元素是布尔值,标识返回的实例对象是否是新创建的


3.返回QuerySet的查询方法


当需要返回多条数据记录时,就需要用到QuerySet对象


QuerySet有个很重要的特性是惰性加载,即在真正使用它的时候才会去访问数据库检索记录

使用all方法获取所有的数据记录:


all_topic = Topic.objects.all()
return HttpResponse("Hello World!" + all_topic[0].content)


使用order_by方法自定义排序规则:


order_by中可以指定多个排序字段,例如,对所有的Topic对象先按照title逆序排列,再按照creat ed_time正序排列:


all_topic = Topic.objects.order_by('-title', 'created_time')


使用filter方法过滤数据记录:

在使用filter方法之前,先来看一看条件查询关键字:


image


对于contains、startswith、endswith关键字,也都有对应的忽略大小写的查询版本,只需要在关键字之前加上字母i就可以了,例如icontains


查询id=1的topic集合:


all_topic = Topic.objects.filter(id__exact=1)


链式查询:

由于filter、exclude这样的方法返回的结果是QuerySet,所以,在它们的后面可以继续调用filter、exclude等方法,这样就形成了链式查询

查询所有激活的管理员用户:


admin_user = User.objects.filter(is_active__exact=1).\
    filter(is_superuser__exact=1)
return HttpResponse("Hello World!" + admin_user[0].username)


image


使用values方法获取字典结果:


可以给values方法传递参数,用于限制SELECT的查询范围


如下只返回id和title列的结果:


topic = Topic.objects.values('id', 'title')
return HttpResponse("Hello World!" + topic[0]['title'])


4.返回RawQuerySet的查询方法


Manager提供了raw方法允许使用原生SQL语句实现对Model的查询


topic = Topic.objects.raw('SELECT id,content FROM post_topic WHERE title = %s', ['大中国'])
return HttpResponse("Hello World!" + topic[0].content)


5.返回其他类型的查询方法


返回QuerySet的对象数量:


topic_count = Topic.objects.filter(id__gt=1).count()
return HttpResponse("Hello World!" + str(topic_count))


判断QuerySet是否包含对象:


image


使用update方法更新Model实例:


Topic.objects.filter(id=1).update(title='中国人')


使用delete方法删除Model实例:


Topic.objects.filter(id=2).delete()


6.存在关联关系的查询


跨关联关系查询:🧨


在查询Topic的时候可能会考虑User的情况,这是很普遍的场景,也被称作跨关联查询


例如:查询topic关联的user中,username包含min的topic集合:


topic = Topic.objects.filter(user__username__contains='min')


这种查询是没有深度限制的:

例如:查询comment关联的topic中,topic关联的user中username等于admin的集合:


image


Model的反向查询:

Django中的每一种关联关系都可以实现反向查询

例如:查询与id=1的user对象关联的topic信息:


user = User.objects.get(id=1)
topic = user.topic_set.all()


对于ManyToManyField和OneToOneField关系类型也可以实现类似的反向查询,但是对于OneToOneField类型的反向查询比较特殊。它的管理器代表的是一个单一的对象,而不是对象集合,且名称变成了小写的Model名


例如之前定义的CustomUser,它的user字段与Django的User存在OneToOneField的关系,那么,User可以这样实现反向查询:


image

版权声明:本文内容由便宜云服务器实名注册用户自发贡献,版权归原作者所有,便宜云服务器开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《便宜云服务器开发者社区用户服务协议》和《便宜云服务器开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
【一日一技】Django不定项数的“或查询”
【一日一技】Django不定项数的“或查询”
9 0
Django model层之执行原始SQL查询
Django model层之执行原始SQL查询
26 0
Django model 层之聚合查询总结
Django model 层之聚合查询总结
22 0
Django不通过外键实现多表关联查询
Django不通过外键实现多表关联查询
20 0
Django ORM 聚合查询和分组查询
对QuerySet计算统计值,需要使用aggregate方法,提供的参数可以是一个或多个聚合函数 Django提供了一系列的聚合函数,其中Avg(平均值)、Count(计数)、Max(最大值)、Min(最小值)、Sum(加和)最为常用 要使用这些聚合函数,需要将它们引入当前的环境中:
40 0
Django ORM F对象和Q对象查询
F对象用于操作数据库中某一列的值,它可以在没有实际访问数据库获取数据值的情况下对字段的值进行引用 使用F对象之前需要将它引入当前的环境中:
53 0
【Django学习笔记 - 13】:关联查询(日期查询、一对一查询、一对多查询、多对多查询)
【Django学习笔记 - 13】:关联查询(日期查询、一对一查询、一对多查询、多对多查询)
217 0
Django 模型查询2.3
Django 模型查询2.3
68 0
Django入门-5:模型的基本使用4-模型查询
Django入门-5:模型的基本使用4-模型查询
83 0
Django—— F、Q查询
Django—— F、Q查询
83 0
+关注
dahezhiquan
文章
问答
视频
文章排行榜
最热
最新
相关电子书
更多
数据资源的基础设施API总线
立即下载
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载


http://www.vxiaotou.com