透过上四节的介绍,他们能透过django的admin介面加进他们的统计数据了,接下去他们须要把那些统计数据展现成两个blog的模样。

具体来说他们在相关联的app下,修正urls.py文档。

article/urls.py导入pathfromdjango.urlsimportpath已经开始布署的应用领域的中文名称app_name =articleurlpatterns = [
    path(test/, views.article_test, name=article_test),Sitapur带队url导出,选定描述符是 views.article_listpath(article_list/, views.article_list, name=article_list),
]

接着再关上article/views.py,再实现相关联的视图函数article_list()

fromarticle.modelsimportArticlePostdefarticle_list(request):articles = ArticlePost.objects.all().order_by(-created)

    total_num= len(articles)须要传递给模版(templates)的对象context = {articles: articles ,num:total_num}render函数:载入模版,并返回context对象returnrender(request,category-list.html, context)

最终利用context把内容都传给模版category-list.html,模版再负责把内容都渲染出来

他们先看其中比较关键的这带队代码:

articles= ArticlePost.objects.all().order_by(-created)

这句话就是将他们在管理页面中插入的articles统计数据,从统计数据库读取出来,并按照创建时间排序。 比较方便的是,不须要写sql语句了,用ORM(Object-Relationl Mapping)操作方法很方便就能完成了。

这里不妨再深入介绍一下,这里返回的articles是两个QuerySet的统计数据类型,这里不要把他理解为两个从统计数据库获取到的返回,我认为能理解成两个sql语句。

因为queryset懒加载 (lazy)的运行模式,也就是说,代码执行到这里,并不会去链接统计数据库查询,可能只是组装了两个查询语句,当你真的使用这个对象(articles)的时候,才会链接统计数据库,并且把查询的统计数据存储到缓存。

比如执行这个句子的时候才是第一次链接统计数据库

total_num= len(articles)

当运行到下面这一句的时候,也没有去链接统计数据库,而是使用了缓存。

context= {articles: articles ,num:total_num}

这样的好处是能避免很多不必要的与统计数据库的链接,提升查询效率。

另外,QuerySet的统计数据类型的另两个特性就是支持链式操作。 执行两个对象中的方法后,得到的结果还是这个对象,这样能接着执行对象上的其他方法。例如:

articles= ArticlePost.objects.all().order_by(-created)articles= articles.fliter(name ="root")

在每两个函数或方法执行结果上能继续调用同样的方法,因为每两个函数的返回值都是QuerySet。

QuerySet有大量的方法返回的都是QuerySet,支持链式操作,比如all()、fliter()、order_by()等,利用那些操作,你能轻松组合你须要的查询条件,具体的还是看看官网吧,这里就不赘述了。

QuerySetAPI

  • 返回新QuerySet的方法filter()exclude()annotate()alias()order_by()reverse()distinct()values()values_list()dates()datetimes()none()all()union()intersection()difference()select_related()prefetch_related()extra()defer()only()using()select_for_update()raw()
  • 返回新QuerySet的操作符AND(&OR(|

同时也有一部分是不返回QuerySet,注意分辨使用。

  • 不返回QuerySet的方法get()create()get_or_create()update_or_create()bulk_create()bulk_update()count()in_bulk()iterator()使用服务器端游标没有服务器端游标latest()earliest()first()last()aggregate()exists()contains()update()Ordered querysetdelete()as_manager()

大家多多尝试一下吧。