django中的queryset操作
2012-10-10 22:52
495 查看
转自:/article/4461186.html
查询API参考
这篇文档详细描述了QuerySet API,是以现有的模型资料和数据库查询知道为基础,所以你在这之前需要阅读和理解这些文档。
在这篇参考中,我们用现有的weblog例子。
当QuerySets被求值
在内部,QuerySet被构造,过滤,裁切,分发,没有实际接触数据库直到被求值的时候。
你可以通过下面方法对QuerySet
求值
跌送. QuerySet 是可跌送的, 并且首先执行数据库查询。例如, 这个会打印数据库里所有entries 的 headline
Python代码
切片. 像说的那样限制QuerySets, QuerySet 可以被切片, 用Python的 array-slicing 语法. 通常切段 QuerySet会返回另一个QuerySet, 但是Django会执行数据库查询当你用 "step"切片参数语法.
序列化/缓存. 看下面的部分,详细介绍了当序列化 QuerySets涉及到的东西.Queryset结果从数据库里读取的重要
repr(). 当调用repr()时候QuerySet会被求值. 这是为了方便Python的交互解释, 因此当执行API交互时,你会立即看到结果
len(). 当调用len()时候QuerySet会被求值. 如你所预计的,这会返回queryset数量.
list(). 强制求值
例如
Python代码
QuerySet API
尽管你通常不会手动创建一个,你会通过一个Manager,这个声明的QuerySet
class QuerySet ([model=None
] )
通常当你要和QuerySet交互,你会用过滤链的方式,大多数QuerySet
的方法都会返回一个新的QuerySet
QuerySet方法返回新的QuerySet
filter(**kwargs)
返回一个匹配查询参数后的新的QuerySet
exclude(**kwargs)
返回一个不匹配查询参数后的新的QuerySet
Python代码
转化为SQL
Sql代码
Python代码
转化为SQL
Sql代码
这个例子排除了所有pub_date大于 '2005-1-3' 或 headline 为 "hello" 的结果
前面带 “-” 为降序
Python代码
同样也可以指定结果字段名
Python代码
values_list(*fields)
将查询结果集的model转化为元组
Python代码
select_related()
取关联数据,可设置关联数据的深度,如果不设置,关联数据为延迟加载方式读取。
Python代码
extra(select=None,
扩展查询
有时候DJANGO的查询API不能方便的设置查询条件,提供了另外的扩展查询方法extra
select
Python代码
Python代码
Python代码
where /
tables
Python代码
order_by
Python代码
params
Python代码
参考官方文档:
https://docs.djangoproject.com/en/dev/ref/models/querysets/
number = len(isps) isp = isps[0] # a2 = isps[-1] # 下标不能用负数 for isp in isps: print isp.ispName isp_list = list(isps) for isp_str in isp_list: print isp_str isp_reps = repr(isps) print isp_reps 返回结果: 2 1 中国移动 世纪互联 ISPModel object ISPModel object ISPModel object ISPModel object [<ISPModel: ISPModel object>, <ISPModel: ISPModel object>, <ISPModel: ISPModel object>, <ISPModel: ISPModel object>]
查询API参考
这篇文档详细描述了QuerySet API,是以现有的模型资料和数据库查询知道为基础,所以你在这之前需要阅读和理解这些文档。
在这篇参考中,我们用现有的weblog例子。
当QuerySets被求值
在内部,QuerySet被构造,过滤,裁切,分发,没有实际接触数据库直到被求值的时候。
你可以通过下面方法对QuerySet
求值
跌送. QuerySet 是可跌送的, 并且首先执行数据库查询。例如, 这个会打印数据库里所有entries 的 headline
Python代码
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数量.
list(). 强制求值
例如
Python代码
entry_list = list(Entry.objects.all())
QuerySet API
尽管你通常不会手动创建一个,你会通过一个Manager,这个声明的QuerySet
class QuerySet ([model=None
] )
通常当你要和QuerySet交互,你会用过滤链的方式,大多数QuerySet
的方法都会返回一个新的QuerySet
QuerySet方法返回新的QuerySet
filter(**kwargs)
返回一个匹配查询参数后的新的QuerySet
exclude(**kwargs)
返回一个不匹配查询参数后的新的QuerySet
Python代码
Entry.objects.exclude(pub_date__gt=datetime.date(2005, 1, 3), headline='Hello')
转化为SQL
Sql代码
SELECT ... WHERE NOT (pub_date > '2005-1-3' AND headline = 'Hello')
Python代码
Entry.objects.exclude(pub_date__gt=datetime.date(2005, 1, 3)).exclude(headline='Hello')
转化为SQL
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集合Python代码
# 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.'}]
同样也可以指定结果字段名
Python代码
>>> 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转化为元组Python代码
>>> 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()
取关联数据,可设置关联数据的深度,如果不设置,关联数据为延迟加载方式读取。Python代码
# 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
Python代码
Entry.objects.extra(select={'is_recent': "pub_date > '2006-01-01'"})
Python代码
Blog.objects.extra( select={ 'entry_count': 'SELECT COUNT(*) FROM blog_entry WHERE blog_entry.blog_id = blog_blog.id' }, )
Python代码
Blog.objects.extra( select=SortedDict([('a', '%s'), ('b', '%s')]), select_params=('one', 'two'))
where /
tables
Python代码
Entry.objects.extra(where=['id IN (3, 4, 5, 20)'])
order_by
Python代码
q = Entry.objects.extra(select={'is_recent': "pub_date > '2006-01-01'"})q = q.extra(order_by = ['-is_recent'])
params
Python代码
Entry.objects.extra(where=['headline=%s'], params=['Lennon'])
参考官方文档:
https://docs.djangoproject.com/en/dev/ref/models/querysets/
相关文章推荐
- Django数据库操作复习实例(一)
- Django数据库操作中You are trying to add a non-nullable field 'name' to contact without a default错误处理
- Django 操作Mysql连表操作
- 转一篇:文档笔记之Django QuerySet
- python——Django(ORM连表操作)
- 通过数据库对Django进行删除字段和删除模型的操作
- django 改写models 的save操作。
- Django进阶(二) 数据库的ORM操作之多对多
- Django之QuerySet 创建对象
- django2 orm常用操作
- Django-Model操作数据库(增删改查、连表结构)
- Django数据库操作API
- Django之ORM操作数据库
- Django 一个简单的图书管理程序(六 添加CSV文件导入导出操作)
- djangoORM数据类型及基本操作
- django学习9 数据库操作命令
- django学习之Model(三)QuerySet
- 详解Django的model查询操作与查询性能优化
- Django-Model操作数据库(增删改查、连表结构)
- Django数据库queryset操作