1. 程式人生 > >Django 將資料輸出到html後,怎麼用?(QuerySet 和Set的區別?)

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 %}