【Django】Django ORM Model的基本查询操作API

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.返回单实例的查询方法

1、使用get查询:

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

在这里插入图片描述

2、使用get_or_create查询:

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

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


3.返回QuerySet的查询方法

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

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

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

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

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

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

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

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

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

在这里插入图片描述

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

查询id=1的topic集合:

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

4、链式查询:

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

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

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

在这里插入图片描述

5、使用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.返回其他类型的查询方法

1、返回QuerySet的对象数量:

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

2、判断QuerySet是否包含对象:

在这里插入图片描述

3、使用update方法更新Model实例:

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

4、使用delete方法删除Model实例:

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

6.存在关联关系的查询

1、跨关联关系查询:

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

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

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

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

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

在这里插入图片描述

2、Model的反向查询:

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

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

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

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

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

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

世界尽头与你

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值