Django 将数据输出到html后,怎么用?(QuerySet 和Set的区别?)

往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 如何使用? 遍历一下就行了。

  1. QuerySet是查询集,{对象1,对象2,对象3,对象4,,,,对象n}
  2. 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 %}
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值