您的位置:首页 > 产品设计 > UI/UE

django中的queryset操作

2012-10-10 22:52 495 查看
转自:/article/4461186.html

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/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: