往html输出的数据大部分是字典。字典的值有很多都是QuerySet。
既然这样,我们首先应该认识认识Queryset。
"""
QuerySet is parametrized with model object
"""
class QuerySet(object):
def __init__(self, model=None, query=None, using=None, hints=None):
"""
:rtype: django.db.models.query.QuerySet[T]
"""
pass
def __iter__(self):
"""
:rtype: collections.Iterator[T]
"""
pass
class Set(set, MutableSet[T], extra=set):
def __new__(cls, *args, **kwds):
if _geqv(cls, Set):
raise TypeError("Type Set cannot be instantiated; "
"use set() instead")
return set.__new__(cls, *args, **kwds)
从QuerySet 和 Set 源代码可以看到,QuerySet并不是Set类型的子类。所以可以说二者没有任何关系。那QuerySet到底是神马? 继续往下看。。。
Query_百度百科
Query,是查询的意思,为了在数据库中寻找某一特定文件、网站、记录或一系列记录,由搜索引擎或数据库送出的消息。简介英文缩写:Query查询命令命令: query use…
QuerySet就是查询集,查询集对应的是SQL的Select…from…where…语句查询出来元组。也可以这么说,QuerySet = 元组+ORM技术。使得可以用对象来操作数据库。(个人理解是这样。不恰当的地方,劳烦大家指出来,不胜荣幸。)
Set就是数学里的集合,集合有什么特点,set就有什么特点。集合有无序性,set也有;集合有唯一性,set也有。
看吧,QuerySet和Set其实并没有多大关系。有的是他俩确实有很多共同特征(唯一性,无序性)。
QuerySet 如何使用? 遍历一下就行了。
- QuerySet是查询集,{对象1,对象2,对象3,对象4,,,,对象n}
- QuerySet = 元组 + ORM技术
使用方法:
从QuerySet中获取对象可以通过for in 的形式遍历,之后通过对象获取对象的具体值。
# 这是在py中使用
categorys = Category.objects.filter(name__isnull=False)
args=dict()
for categ in categorys:
args[categ.name]=get_sorted_posts(categ)
# 这是在py中的使用方法。在html中类似,不过得用{%%}括起来,以证明这是python语句。
# 把'args':args['blogpostss'],传给html。
# args['blogpostss'] = BlogPost.objects.exclude(title__in=exclude_posts)
def home(request, page=''):
args = dict()
# include 包括 exclude 不包括
args['blogpostss'] = BlogPost.objects.exclude(title__in=exclude_posts)
max_page = ceil(len(args['blogpostss']) / 3)
if page and int(page) < 2: # /0, /1 -> /
return redirect("/")
else:
page = int(page) if (page and int(page) > 0) else 1
args['page'] = page
args['prev_page'] = page + 1 if page < max_page else None
args['newer_page'] = page - 1 if page > 1 else None
args['sl'] = str(3 * (page - 1)) + ':' + str(3 * (page - 1) + 3)
# 用来展示分类信息
categorys = Category.objects.filter(name__isnull=False)
cont ={
'args':args['blogpostss'],
'categorys':categorys,
}
return render(request, 'blog/index.html', cont)
# 这是html使用queryset。
{% for blogpost in args|slice:":3" %}
<!--这里用来显示标题 点击阅读更多-->
<a href="{{ blogpost.get_absolute_url }}">
{{ blogpost.title }}</a>
{{ blogpost.pub_date|date:'M' }}
{{blogpost.views}}
{% endfor %}