该系列教程系小我私家原创,并完整颁布在小我私家官网刘江的博客和教程 所有转载本文者,需在顶部显著位置注明原作者及官网地点。 Python及Django学习QQ群:453131687
本节将详细介绍盘问集的API,它成立不才面的模型根本上,与上一节的模型不异:
from django.db import models class Blog(models.Model): name = models.CharField(max_length=100) tagline = models.TextField() def __str__(self): # __unicode__ on Python 2 return self.name class Author(models.Model): name = models.CharField(max_length=200) email = models.EmailField() def __str__(self): # __unicode__ on Python 2 return self.name class Entry(models.Model): blog = models.ForeignKey(Blog, on_delete=models.CASCADE) headline = models.CharField(max_length=255) body_text = models.TextField() pub_date = models.DateField() mod_date = models.DateField() authors = models.ManyToManyField(Author) n_comments = models.IntegerField() n_pingbacks = models.IntegerField() rating = models.IntegerField() def __str__(self): # __unicode__ on Python 2 return self.headline
一、QuerySet何时被提交在内部,创建、过滤、切片和通报一个QuerySet不会真实操纵数据库,在你对盘问集提交之前,不会产生任何实际的数据库操纵。
可以使用下列要领对QuerySet提交盘问操纵:
迭代
QuerySet是可迭代的,在初度迭代盘问集时执行实际的数据库盘问。 例如, 下面的语句会将数据库中所有Entry的headline打印出来:
for e in Entry.objects.all(): print(e.headline)切片:如果使用切片的”step“参数,Django 将执行数据库盘问并返回一个列表。
Pickling/缓存
repr()
len():当你对QuerySet挪用len()时, 将提交数据库操纵。
list():对QuerySet挪用list()将强制提交操纵entry_list = list(Entry.objects.all())
bool()
测试布尔值,像这样:
if Entry.objects.filter(headline="Test"): print("There is at least one Entry with the headline Test")注:如果你需要知道是否存在至少一笔记录(而不需要真实的东西),使用exists() 将越发高效。
二、QuerySet下面是对付QuerySet的正式界说:
class QuerySet(model=None, query=None, using=None)[source]QuerySet类具有两个公有属性用于内省:
ordered:如果QuerySet是排好序的则为True,否则为False。
db:如果此刻执行,则返回使用的数据库。
三、返回新QuerySets的API以下的要领都将返回一个新的QuerySets。重点是加粗的几个API,其它的使用场景很少。
要领名 解释filter() 过滤盘问东西。
exclude() 排除满足条件的东西
annotate() 使用聚合函数
order_by() 对盘问集进行排序
reverse() 反向排序
distinct() 对盘问集去重
values() 返回包罗东西具体值的字典的QuerySet
values_list() 与values()类似,只是返回的是元组而不是字典。
dates() 按照日期获取盘问集
datetimes() 按照时间获取盘问集
none() 创建空的盘问集
all() 获取所有的东西
union() 并集
intersection() 交集
difference() 差集
select_related() 附带盘问关联东西
prefetch_related() 预先盘问
extra() 附加SQL盘问
defer() 不加载指定字段
only() 只加载指定的字段
using() 选择数据库
select_for_update() 锁住选择的东西,直到事务结束。
raw() 接收一个原始的SQL盘问
1. filter()
filter(**kwargs)
返回满足盘问参数的东西调集。
查找的参数(**kwargs)应该满足下文字段查找中的格局。多个参数之间是和AND的关系。
2. exclude()exclude(**kwargs)
返回一个新的QuerySet,它包罗不满足给定的查找参数的东西。
查找的参数(**kwargs)应该满足下文字段查找中的格局。多个参数通过AND连接,然后所有的内容放入NOT() 中。