flyEn'blog

django文档—queryset

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
2
3
4
5
>>> Blog.objects.filter(name__startswith='Beatles')
[<Blog: Beatles Blog>]

>>> Blog.objects.filter(name__startswith='Beatles').values()
[{'id': 1, 'name': 'Beatles Blog', 'tagline': 'All the latest Beatles news.'}]

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的一个实例。

返回一个QuerySet,当执行它的查询时它沿着外键关系查询关联的对象的数据。

1
2
3
4
5
e = 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)

返回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

参数

  1. select
    可以让你在 SELECT 从句中添加其他字段信息,它应该是一个字典,存放着属性名到 SQL 从句的映射。

    1
    Entry.objects.extra(select={'is_recent': "pub_date > '2006-01-01'"})
  2. where/tables

    1
    Entry.objects.extra(where=["foo='a' OR bar = 'a'", "baz = 'a'"])

翻译成如下sql

1
SELECT * FROM blog_entry WHERE (foo='a' OR bar='a') AND (baz='a')

  1. order_by
  2. 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
9
try:
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
2
3
4
import datetime
start_date = datetime.date(2005, 1, 1)
end_date = datetime.date(2005, 3, 31)
Entry.objects.filter(pub_date__range=(start_date, end_date))

second

datetime字段精确的第二个匹配

一个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 必须为数值。

默认的别名:__avg
返回类型: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()的操作。

Fork me on GitHub