查询API参考
这篇文档详细描述了QuerySet
API,是以现有的模型资料和数据库查询知道为基础,所以你在这之前需要阅读和理解这些文档。
在这篇参考中,我们用现有的weblog例子。
当QuerySets被求值
在内部,QuerySet被构造,过滤,裁切,分发,没有实际接触数据库直到被求值的时候。
你可以通过下面方法对QuerySet
求值
- 跌送. QuerySet 是可跌送的, 并且首先执行数据库查询。例如, 这个会打印数据库里所有entries 的 headline
for e in Entry.objects.all():
print e.headline
- 切片. 像说的那样限制QuerySets, QuerySet 可以被切片, 用Python的 array-slicing 语法. 通常切段 QuerySet会返回另一个QuerySet, 但是Django会执行数据库查询当你用 "step"切片参数语法.
-
序列化/缓存. 看下面的部分,详细介绍了当序列化 QuerySets涉及到的东西.Queryset结果从数据库里读取的重要
-
repr(). 当调用repr()时候QuerySet会被求值. 这是为了方便Python的交互解释, 因此当执行API交互时,你会立即看到结果
-
len(). 当调用len()时候QuerySet会被求值. 如你所预计的,这会返回queryset数量.
QuerySet API
尽管你通常不会手动创建一个,你会通过一个Manager,这个声明的QuerySet
class QuerySet
([
model=None
]
)
通常当你要和QuerySet交互,你会用过滤链的方式,大多数
QuerySet
的方法都会返回一个新的QuerySet
QuerySet方法返回新的QuerySet
filter(**kwargs)
返回一个匹配查询参数后的新的QuerySet
exclude(**kwargs)
返回一个不匹配查询参数后的新的QuerySet
Entry.objects.exclude(pub_date__gt=datetime.date(2005, 1, 3), headline='Hello')
转化为SQL
SELECT ...
WHERE NOT (pub_date > '2005-1-3' AND headline = 'Hello')
Entry.objects.exclude(pub_date__gt=datetime.date(2005, 1, 3)).exclude(headline='Hello')
转化为SQL
SELECT ...
WHERE NOT pub_date > '2005-1-3'
OR NOT headline = 'Hello'
这个例子排除了所有pub_date大于 '2005-1-3' 或 headline 为 "hello" 的结果
order_by(*fields)
排序 Entry.objects.filter(pub_date__year=2005).order_by('-pub_date', 'headline')
前面带 “-” 为降序
reverse()
将查询结果排序反转
distinct()
去重复
values(*fields)
把查询结果转化为字典列表取代model集合
# This list contains a Blog object.
>>> Blog.objects.filter(name__startswith='Beatles')
[<Blog: Beatles Blog>]
# This list contains a dictionary.
>>> Blog.objects.filter(name__startswith='Beatles').values()
[{'id': 1, 'name': 'Beatles Blog', 'tagline': 'All the latest Beatles news.'}]
同样也可以指定结果字段名
>>> Blog.objects.values()
[{'id': 1, 'name': 'Beatles Blog', 'tagline': 'All the latest Beatles news.'}],
>>> Blog.objects.values('id', 'name')
[{'id': 1, 'name': 'Beatles Blog'}]
values_list(*fields)
将查询结果集的model转化为元组
>>> Entry.objects.values_list('id', 'headline')
[(1, u'First entry'), ...]
>>> Entry.objects.values_list('id').order_by('id')
[(1,), (2,), (3,), ...]
>>> Entry.objects.values_list('id', flat=True).order_by('id')
[1, 2, 3, ...]
all()
取所有结果
select_related()
取关联数据,可设置关联数据的深度,如果不设置,关联数据为延迟加载方式读取。
# Hits the database.
e = Entry.objects.get(id=5)
# Hits the database again to get the related Blog object.
b = e.blog
# Hits the database.
e = Entry.objects.select_related().get(id=5)
# Doesn't hit the database, because e.blog has been prepopulated
# in the previous query.
b = e.blog
class City(models.Model):
# ...
class Person(models.Model):
# ...
hometown = models.ForeignKey(City)
class Book(models.Model):
# ...
author = models.ForeignKey(Person)
b = Book.objects.select_related().get(id=4)
p = b.author # Doesn't hit the database.
c = p.hometown # Doesn't hit the database.
b = Book.objects.get(id=4) # No select_related() in this example.
p = b.author # Hits the database.
c = p.hometown # Hits the database.
extra(select=None,
where=None,
params=None,
tables=None,
order_by=None,
select_params=None
扩展查询
有时候DJANGO的查询API不能方便的设置查询条件,提供了另外的扩展查询方法extra
select
Entry.objects.extra(select={'is_recent': "pub_date > '2006-01-01'"})
Blog.objects.extra(
select={
'entry_count': 'SELECT COUNT(*) FROM blog_entry WHERE blog_entry.blog_id = blog_blog.id'
},
)
Blog.objects.extra(
select=SortedDict([('a', '%s'), ('b', '%s')]),
select_params=('one', 'two'))
where
/ tables
Entry.objects.extra(where=['id IN (3, 4, 5, 20)'])
order_by
q = Entry.objects.extra(select={'is_recent': "pub_date > '2006-01-01'"})
q = q.extra(order_by = ['-is_recent'])
params
Entry.objects.extra(where=['headline=%s'], params=['Lennon'])
分享到:
相关推荐
Django 1.0 中文文档.docDjango 1.0 中文文档.docDjango 1.0 中文文档.docDjango 1.0 中文文档.doc
django 1.0官方的使用文档chm打包
python库,解压后可用。 资源全名:django_admin_multilang-1.0-py3-none-any.whl
django-python3-ldap, python 3的Django LDAP用户身份验证后端 django-python3-ldapdjango-python3-ldap 为 python 2和 3提供了一个 Django LDAP用户身份验证后端。特性使用LDAP服务器验证用户身份。将LDAP用户与...
Django1.0以上版本的教材-DjangoBook2.0中文版.pdf 适用于Django1.0以上的环境
资源来自pypi官网。 资源全名:django-tables2-column-shifter-0.3.0.tar.gz
资源分类:Python库 所属语言:Python 资源全名:djangocms_algolia-1.3.1.0-py3-none-any.whl 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059
为支持django3对django_cas_ng进行修改 **Features** - Support CAS version 1.0, 2.0, 3.0 - Support Single Sign Out - Configuration of services via the django Admin application - Fine control on ...
Django1.0速查手册,Django 1.0 Cheat sheet
django-admin-bootstrap-master.zip
1、基于Django+Django -Rest-Framework+Python的在线考试系统后端(源码).zip 2、该资源包括项目的全部源码,下载可以直接使用! 3、本项目适合作为计算机、数学、电子信息等专业的课程设计、期末大作业和毕设项目...
django-classy-tags, 基于类的Django 模板标记 django-classy-tags请参考文档/目录中的文档以获得帮助。 有关HTML呈现版本的信息,请参见这里的 。 这里项目这个项目的目标是创建一种新的编写 Django 模板标签的方法...
资源来自pypi官网。 资源全名:django_pumaska-1.0rc2-py3-none-any.whl
django社团管理系统-包含源码-说明文档.zip django社团管理系统-包含源码-说明文档.zip django社团管理系统-包含源码-说明文档.zip 开发语言:Python 框架:django Python版本:python3.7.7 数据库:mysql 5.7(一定...
项目概述:django-lb-workflow 是一个基于Python的高效易用Django流程引擎源码,旨在轻松集成至现有系统。该项目主要由68个Python文件、30个HTML文件以及其他相关文件构成,共计136个文件。其中还包括了HTML模板、...
资源分类:Python库 所属语言:Python 使用前提:需要解压 资源全名:django_anymail-4.1-py2.py3-none-any.whl 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059
python库。 资源全名:django-microsip-base-1.0.5.zip
Django-2.0.4 Django-2.0.4 Django-2.0.4 Django-2.0.4 Django-2.0.4