queryset 方法
相反:reverse()
反向排序QuerySet 中返回的元素。第二次调用reverse() 将恢复到原有的排序。1
my_queryset.reverse()[:5]
去重:distinct([*fields])
注:指定字段名称时,必须在QuerySet中提供order_by()
,而且order_by()
中的字段必须以distinct()
中的字段相同开始并且顺序相同。1
>>> Entry.objects.order_by('author', 'pub_date').distinct('author', 'pub_date')
值(字典):values([*fields])
1 | >>> Blog.objects.filter(name__startswith='Beatles') |
values() 接收可选的位置参数*fields,它指定SELECT 应该限制哪些字段。如果指定字段,每个字典将只包含指定的字段的键/值。
值(元组):values_list(*fields, flat=False)
与values()类似,只是在迭代时返回的时元组而不是字典。
如果只传递一个字段,可以传递flat参数。如果为True,它表示返回的结果不是元组而是单个值。1
2
3
4
5>>> Entry.objects.values_list('id').order_by('id')
[(1,), (2,), (3,), ...]
>>> Entry.objects.values_list('id', flat=True).order_by('id')
[1, 2, 3, ...]
如果有多个字段,传递flat 将发生错误。
日期:dates(field, kind, order=’ASC’)
返回DateQuerySet - QuerySet,其计算结果为datetime.date对象列表,表示特定种类的所有可用日期QuerySet。
field应为模型的DateField的名称。 kind应为”year”、”month”或”day”。
- “year” 返回对应该field的所有不同年份值的list。
- “month”返回字段的所有不同年/月值的列表。
- “day”返回字段的所有不同年/月/日值的列表。
1
2
3
4>>> Entry.objects.dates('pub_date', 'year')
[datetime.date(2005, 1, 1)]
>>> Entry.objects.dates('pub_date', 'month')
[datetime.date(2005, 2, 1), datetime.date(2005, 3, 1)]
数据时间:datetimes(field_name, kind, order=’ASC’, tzinfo=None)
none()
调用none()将创建一个不返回任何对象的查询集,查询集是EmptyQuerySet的一个实例。
select_related(*fields)
返回一个QuerySet,当执行它的查询时它沿着外键关系查询关联的对象的数据。1
2
3
4
5e = Entry.objects.get(id=5)
b = e.blog # 需要再次查询数据库得到关联对象数据
e = Entry.objects.select_related('blog').get(id=5)
b = e.blog # 不用查询数据库
也可以沿着外键查询1
2
3
4# Book类里关联着Person(名author),person类里关联着City(名hometown)
b = Book.objects.select_related('author__hometown').get(id=4)
p = b.author # 不用查询数据库
c = p.hometown # 不用查询数据库
清除queryset上以前的select_related添加的关联字段,可以传递None作为参数:1
>>> without_relations = queryset.select_related(None)
prefetch_related(lookups)(``)
返回QuerySet,它将在单个批处理中自动检索每个指定查找的相关对象。
与select_related类似的目的,两者都被设计为阻止由访问相关对象而导致的数据库查询的泛滥。
可以使用Prefetch对象进一步控制预取操作。
额外:extra
(select=None, where=None, params=None, tables=None, order_by=None, select_params=None)
能在Queryset生成的sql从句中注入新子句。
每次使用它时,您都应该转义用户可以使用params控制的任何参数,以防止SQL注入攻击。SQL injection protection
参数
select
可以让你在 SELECT 从句中添加其他字段信息,它应该是一个字典,存放着属性名到 SQL 从句的映射。1
Entry.objects.extra(select={'is_recent': "pub_date > '2006-01-01'"})
where/tables
1
Entry.objects.extra(where=["foo='a' OR bar = 'a'", "baz = 'a'"])
翻译成如下sql1
SELECT * FROM blog_entry WHERE (foo='a' OR bar='a') AND (baz='a')
- order_by
- params
1
Entry.objects.extra(where=['headline=%s'], params=['Lennon'])
Bad:Entry.objects.extra(where=[“headline=’Lennon’”])
延迟:defer(fields) (``)
延迟字段集
only(fields)(``)
only()方法或多或少与defer()相反。
using(alias)
如果你使用多个数据库,这个方法用于控制QuerySet 将在哪个数据库上求值。这个方法的唯一参数是数据库的别名,定义在DATABASES。
select_for_update(nowait=False)
返回一个 queryset ,会锁定相关行直到事务结束。在支持的数据库上面产生一个SELECT … FORUPDATE语句。
这意味着可以通过锁防止数据被其它事务修改。
raw(raw_query, params=None, translations=None)
接收一个原始的SQL 查询,执行它并返回一个django.db.models.query.RawQuerySet 实例。这个RawQuerySet 实例可以迭代以提供实例对象,就像普通的QuerySet 一样。
执行原始的SQL 查询
get_or_creaate(defaults=None, **kwargs)
1 | obj, created = Person.objects.get_or_create(first_name='John', last_name='Lennon', defaults={'birthday': date(1940, 10, 9)}) |
get(first_name=’John’, last_name=’Lennon’)
create(first_name=’John’, last_name=’Lennon’, ‘birthday’: date(1940, 10, 9))
update_or_create(defaults=None, **kwargs)
这用作样板代码的一种快捷方式。例如1
2
3
4
5
6
7
8
9try:
obj = Person.objects.get(first_name='John', last_name='Lennon')
for key, value in updated_values.iteritems():
setattr(obj, key, value)
obj.save()
except Person.DoesNotExist:
updated_values.update({'first_name': 'John', 'last_name': 'Lennon'})
obj = Person(**updated_values)
obj.save()
bulk_create(objs, batch_size=None)
以有效的方式(通常只有1个查询,无论有多少对象)将提供的对象列表插入到数据库中1
2
3
4
5>>> Entry.objects.bulk_create([
... Entry(headline="Django 1.0 Released"),
... Entry(headline="Django 1.1 Announced"),
... Entry(headline="Breaking: Django is awesome")
... ])
batch_size参数控制在单个查询中创建的对象数。默认值为每个查询最多使用999个变量。
in_bulk(id_list)
获取主键值的列表,并返回将每个主键值映射到具有给定ID的对象的实例的字典。1
2
3
4
5
6>>> Blog.objects.in_bulk([1])
{1: <Blog: Beatles Blog>}
>>> Blog.objects.in_bulk([1, 2])
{1: <Blog: Beatles Blog>, 2: <Blog: Cheddar Talk>}
>>> Blog.objects.in_bulk([])
{}
iterator()
queryset通常在内部缓存其结果,以便重复计算不会到值其他查询, 相反,iterator()将直接读取结果,而不在QuerySet级别执行任何缓存。
对于返回大量只需要访问一次的对象的QuerySet,这可以带来更好的性能和显着减少内存。
latest(field_name=None)
字段的最新
对象。
earliest(field_name=None)
字段的最早
对象
first()
返回结果集的第一个对象, 当没有找到时返回None
last()
返回结果集的最后一个对象
aggregate(args, *kwargs)
返回一个字典,包含根据QuerySet 计算得到的聚合值(平均数、和等等)。aggregate() 的每个参数指定返回的字典中将要包含的值。
聚合函数1
2>>> q = Blog.objects.aggregate(number_of_entries=Count('entry'))
{'number_of_entries': 16}
如果没用关键字参数来指定聚合函数,会返回名称为entry__count
exists()
exists() 用于搜寻对象是否在QuerySet 中以及QuerySet 是否存在任何对象。
update(**kwargs)
1 | Entry.objects.filter(id=10).update(comments_on=False) |
尽量避免查询出来再改之后save()
字段查找
exact
精确匹配
iexact
不区分大小写的精确匹配
contains
包含
icontains
不区分大小写包含
in
在给定的列表里
gte
大于或等于
1
小于
lte
小于或等于
startswith
区分大小写,开始位置匹配
istartswith
不区分大小写
end
区分大小写,匹配以’ ‘结束
iendswith
不区分大小写
range
1 | import datetime |
second
datetime字段精确的第二个匹配
search
一个boolean类型的全文搜索。像contains,但是由于全文索引的优势,以使它更显著的快。
regex
区分大小写的正则表达式匹配。1
Entry.objects.get(title__regex=r'^(An?|The) +')
iregex
不区分大小写的正则表达式匹配。
聚合函数
Aggregation functions
在queryset未空时,聚合函数将返回None。但count是个例外,如果queryset为空,它将返回0。
所有聚合函数都有以下共同的参数:
- expression
引用模型字段的一个字符串。 - output_field
用来表示返回值的模型字段。(可选) - `extra` **:这些关键字参数可以给聚合函数生成的SQL 提供额外的信息。
Avg
class Avg(expression, output_field=None, **extra)
返回给定expression 的平均值,其中expression 必须为数值。
默认的别名:
返回类型:float
Count
class Count(expression, distinct=False, **extra)
distinct:如果distinct=True,Count 将只计算唯一的实例。
Max
class Max(expression, output_field=None, **extra)
Min
class Min(expression, output_field=None, **extra)
StdDev
class StdDev(expression, sample=False, **extra)
Sum
class Sum(expression, output_field=None, **extra
Variance
class Variance(expression, sample=False, **extra)
Q()
class Variance(expression, sample=False, **extra)
参数:sample
默认情况下,Variance 返回群体的方差。但是,如果sample=True,返回的值将是样本的方差。
查询相关的类
Q()对象
Prefetch()对象
class Prefetch(lookup, queryset=None, to_attr=None)
Prefetch()对象可用于控制prefetch_related()的操作。