通过上一节的了解,我们可以通过django的admin界面添加自己的数据了,接下来我们需要把这些数据展示成一个blog的样子。
首先我们在对应的app下,修改urls.py文件。
artic++le/urls.py# 引入pathfrom django.urls import path# 正在部署的应用的名称app_name = 'article'urlpatterns = [ path('test/', views.article_test, name='article_test'), #新加一行url解析,指定处理函数是 views.article_list path('article_list/', views.article_list, name='article_list'),]然后再打开article/views.py,再实现对应的视图函数article_list():
from article.models import ArticlePostdef article_list(request): articles = ArticlePost.objects.all().order_by('-created') total_num= len(articles) # 需要传递给模板(templates)的对象 context = { 'articles': articles ,'num':total_num} # render函数:载入模板,并返回context对象 return render(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()等,利用这些操作,你可以轻松组合你需要的查询条件,具体的还是看看官网吧,这里就不赘述了。
QuerySet api
返回新 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 queryset delete() as_manager()大家多多尝试一下吧。