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)

使用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
方法之前,先来看一看条件查询关键字:

对于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)

使用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是否包含对象:

使用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的集合:

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可以这样实现反向查询:
