1. 程式人生 > >網站搭建 (第09天) 博客統計排行

網站搭建 (第09天) 博客統計排行

djang play 最新 lte 日期格 random ron 作用 recommend

一、前言

  ?在閱讀計數功能之後,就可以可根據每篇博客的閱讀量來對博客進行熱門統計排行了,如閱讀周榜,月榜,總榜。基本上只要實現其中一個,其他兩個也能照著做出來,大體上的邏輯是一樣的。都是通過django自帶的工具包中的timezone模塊獲取今天的日期格式,再通過datetime模塊的timedelta方法來做日期的差值,然後篩選出這兩個時間點之間發表的文章,除了總榜只需要篩選出日期小於今天發表的文章。將該時間段的博客列表篩選出來之後,通過聚合函數求出每篇文章的閱讀量總和,然後進行閱讀量的排序

二、周榜

import datetime
from django.utils import timezone
from django.db.models import Sum
from blog.models import Post

def get_7_days_read_posts():
    """
    作用:獲取閱讀量周榜博客榜單
    :return: 周榜博客前15條博客
    """
    today = timezone.now().date()
    date = today - datetime.timedelta(days=7)
    posts = Post.objects         .filter(Q(display=0) | Q(display__isnull=True), read_detail__date__lt=today, read_detail__date__gte=date)         .values(‘id‘, ‘title‘)         .annotate(read_num_sum=Sum(‘read_detail__read_num‘))         .order_by(‘-read_num_sum‘)
    return posts[:15]

三、月榜

import datetime
from django.utils import timezone
from django.db.models import Sum
from blog.models import Post

def get_30_days_read_posts():
    """
    作用:獲取閱讀量月榜博客榜單
    :return: 月榜博客前15條博客
    """
    today = timezone.now().date()
    date = today - datetime.timedelta(days=30)
    posts = Post.objects         .filter(Q(display=0) | Q(display__isnull=True), read_detail__date__lt=today, read_detail__date__gte=date)         .values(‘id‘, ‘title‘)         .annotate(read_num_sum=Sum(‘read_detail__read_num‘))         .order_by(‘-read_num_sum‘)
    return posts[:15]

四、總榜

import datetime
from django.utils import timezone
from django.db.models import Sum
from blog.models import Post

def get_all_read_posts():
    """
    作用:獲取閱讀量總榜博客榜單
    :return: 總榜博客前15條博客
    """
    today = timezone.now().date()
    posts = Post.objects         .filter(Q(display=0) | Q(display__isnull=True), read_detail__date__lt=today)         .values(‘id‘, ‘title‘)         .annotate(read_num_sum=Sum(‘read_detail__read_num‘))         .order_by(‘-read_num_sum‘)
    return posts[:15]

五、最新發表

from blog.models import Post

new_publish = Post.objects.all()[:15]

六、最新推薦

import datetime
from django.utils import timezone
from .models import ReadDetail

def get_new_recommend_post(content_type):
    """
    作用:獲取最新推薦博客列表
    :param content_type: 數據表的模型類
    :return: 最新推薦的前15條博客
    """
    today = timezone.now().date()
    yesterday = today - datetime.timedelta(days=1)
    read_detail = ReadDetail.objects.filter(content_type=content_type, date=yesterday).order_by(‘-read_num‘)
    return read_detail[0:15]  # 前十五條

七、隨機推薦

import random
from blog.models import Post

def get_random_recomment():
    """
    作用:獲取隨機推薦博客列表
    :return: 隨機推薦的前15條博客
    """
    # 隨機推薦
    random_posts = set()

    post_list = Post.objects.filter(Q(display=0) | Q(display__isnull=True))
    if post_list.count() < 15:
        return post_list

    while random_posts.__len__() < 15:
        random_posts.add(random.choice(post_list))

    return random_posts

  原文出處:https://jzfblog.com/detail/65,文章的更新編輯以此鏈接為準。歡迎關註源站文章!

網站搭建 (第09天) 博客統計排行