×

blog 数据库 context

blog模板(blog例子)

访客 访客 发表于2022-05-05 12:26:00 浏览350 评论5

5人参与发表评论

通过上一节的了解,我们可以通过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()

大家多多尝试一下吧。

群贤毕至

访客
孤央橘亓 孤央橘亓2022-06-19 10:02:44 | 回复 的方法,因为每一个函数的返回值都是QuerySet。QuerySet有大量的方法返回的都是QuerySet,支持链式操作,比如all()、fliter()、order_by()等,利用这些操作,你可以轻松组合你需要的查询条件,具体的还是看看官网吧,这里就不赘述了。Query
性许笙沉 性许笙沉2022-06-19 16:28:48 | 回复 al_num} # render函数:载入模板,并返回context对象 return render(request, 'category-list.html', context)最终利用conte
馥妴叔途 馥妴叔途2022-06-19 08:23:22 | 回复 页面中插入的articles数据,从数据库读取出来,并按照创建时间排序。 比较方便的是,不需要写sql语句了,用ORM(Object-Relationl Mapping)操作方法很方便就可以完
囤梦怯朲 囤梦怯朲2022-06-19 16:01:10 | 回复 Object-Relationl Mapping)操作方法很方便就可以完成了。这里不妨再深入了解一下,这里返回的articles是一个QuerySet的数据类型,这里不要把他理解为一个从数据库获取到的返回,我认为可以理解成一个sql语句。因为queryset懒加载
瑰颈闻呓 瑰颈闻呓2022-06-19 12:38:28 | 回复 询的数据存储到缓存。比如执行这个句子的时候才是第一次链接数据库total_num= len(articles)当运行到下面这一句的时候,也没有去链接数据库,而是使用了缓存。context = { 'artic