on_delete = models.CASCADE) 调用Book.objects.select_related(‘

时间:2021-12-21 05:16:03

该系列教程系小我私家原创,并完整颁布在小我私家官网刘江的博客和教程 所有转载本文者,需在顶部显著位置注明原作者及官网地点。 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() 中。