接上回写过的文章
下面将会使用到的模型类
class Article(models.Model): """博客文章模型类""" title = models.CharField(max_length=100, verbose_name="博客标题", unique=True) category = models.CharField(max_length=50, verbose_name="博客标签") pub_date = models.DateTimeField(auto_now_add=True, editable=True, verbose_name="发布时间") update_time = models.DateTimeField(auto_now=True, null=True, verbose_name="更新时间") content = models.TextField(blank=True, null=True, verbose_name="博客正文") def __str__(self): return self.title通常情况下,我们习惯使用 if queryset来判断查询集是否为空,这样会从数据库取出查询集中的所有数据
使用if queryset.exists(),只会从数据库中取一条数据。
>>> from apps.article.models import Article >>> arts = Article.objects.all() >>> arts.exists() True >>> arts arts.exists()执行的查询 (0.000) SELECT (1) AS `a` FROM `article_article` LIMIT 1; args=() arts执行的查询 (0.001) SELECT `article_article`.`id`, `article_article`.`title`, `article_article`.`category`, `article_article`.`pub_date`, `article_article`.`update_time`, `article_article`.`content` FROM `article_article` LIMIT 21; args=()通常情况下,我们习惯于使用len()获取一个对象中的数据个数,但是len(queryset)这样会从数据库取出查询集中的所有数据。
使用queryset.count(),会直接使用数据库计数函数count()来计算数据个数,当数据量较大时会节省查询时间。
>>> from apps.article.models import Article >>> arts = Article.objects.all() >>> arts.count() 24 >>> len(arts) 24 arts.count()执行的查询 (0.001) SELECT COUNT(*) AS `__count` FROM `article_article`; args=() len(arts)执行的查询 (0.002) SELECT `article_article`.`id`, `article_article`.`title`, `article_article`.`category`, `article_article`.`pub_date`, `article_article`.`update_time`, `article_article`.`content` FROM `article_article`; args=()大多数,一个数据表中的数据列,我们只会用到其中的一列或者两列,这时就没有必要从数据库中查询其他列的数据,使用 quertset.values(*field)可以取指定的数据列。
>>> from apps.article.models import Article >>> arts = Article.objects.all() >>> for art in arts.values('title'): ... print(art['title']) ... 基于PyMySQL的数据库连接 Django中如何使用markdown Django全文检索 ... >>> for art in arts: ... print(art.title) ... 基于PyMySQL的数据库连接 Django中如何使用markdown Django全文检索 .... 执行的sql语句 (0.001) SELECT `article_article`.`title` FROM `article_article`; args=() (0.002) SELECT `article_article`.`id`, `article_article`.`title`, `article_article`.`category`, `article_article`.`pub_date`, `article_article`.`update_time`, `article_article`.`content` FROM `article_article`; args=()这几种方法都没有改变查询数据库的次数,主要优化在减少从数据库中取出的数据量,以此来加快查询速度。