5 功能4:个人站点页面设计(ORM跨表与分组查询)
1、个人站点页面文章的查询

# 个人站点
http://www.cnblogs.com/wh1520577322/
http://www.cnblogs.com/liucong12345/
http://www.cnblogs.com/kin1492/
(1)用户未找到,404页面构建
url
# 个人站点页面设计
re_path(r'^(?P<username>\w+)$', views.home_site, name='home_site'),
view


404.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<link rel="stylesheet" href="/static/blog/bs/css/bootstrap.css">
</head>
<body> <div class="container" style="margin-top: 100px">
<div class="text-center">
<a href="http://www.cnblogs.com/"><img src="/static/img/log_small.gif" alt="cnblogs"></a>
<p><b>404.</b> 抱歉! 您访问的资源不存在!</p>
<p class="d">请确认您输入的网址是否正确,如果问题持续存在,请发邮件至 404042726@qq.com 与 <strong style="font-size: 28px">老村长</strong> 联系。</p>
<p><a href="/">返回网站首页</a></p> </div>
</div>
</body>
</html>

(2)查询当前站点对应的所有文章

def home_site(request, username):
"""
个人站点视图函数
:param request:
:return:
"""
print("username", username)
user_obj = models.UserInfo.objects.filter(username=username).exists() # 判断用户是否存在
if not user_obj:
return render(request, "blog/not_found.html") # 查询当前站点对象
blog = user_obj.blog # 当前用户或者当前站点对应的所有文章 # 方式1:基于对象查询
article_list = user_obj.article_set.all() # 方式2:基于__
article_list = models.Article.objects.filter(user=user_obj) return render(request, 'blog/home_site.html')
2、个人站点标签与分类查询
# 跨表的分组查询的模型:
# 每一个后的表模型.objects.values("pk").annotate(聚合函数(关联表__统计字段)).values("表模型的所有字段以及统计字段") # 推荐pk字段查找 # 查询每一个分类名称以及对应的文章数 # 查询当前站点的每一个分类名称以及对应的文章数 # 查询当前站点的每一个标签名称以及对应的文章数 # 查询当前站点每一个年月的名称以及对应的文章数







(1)查询每一个分类名称以及对应的文章数

# 查询每一个分类名称以及对应的文章数
# 全部blog的
ret1 = models.Category.objects.values('pk').annotate(c=Count("article__title")).values("title", 'c')
print(ret1) # 查询当前站点的每一个分类名称以及对应的文章数
# 只取当前用户站点的
# ret1 = models.Category.objects.filter(blog=blog).values('pk').annotate(c=Count("article__title")).values("title",'c')
ret1 = models.Category.objects.filter(blog=blog).values('pk').annotate(c=Count("article__title")).values_list("title", 'c')
print(ret1)




(2) 查询当前站点的每一个标签名称以及对应的文章数





3、日期归档查询1

(1)知识点:date_format

1 date_format
============date,time,datetime===========
create table t_mul(d date,t time,dt datetime);
insert into t_mul values(now(),now(),now());
select * from t_mul;
mysql> select * from t_mul;
+------------+----------+---------------------+
| d | t | dt |
+------------+----------+---------------------+
| 2017-08-01 | 19:42:22 | 2017-08-01 19:42:22 |
+------------+----------+---------------------+
1 row in set (0.00 sec)
select date_format(dt,"%Y/%m/%d") from t_mul;


(2)知识点2:extra


extra(select=None, where=None, params=None, tables=None, order_by=None, select_params=None)
有些情况下,Django的查询语法难以简单的表达复杂的 WHERE 子句,对于这种情况, Django 提供了 extra() QuerySet修改机制 — 它能在 QuerySet生成的SQL从句中注入新子句
extra可以指定一个或多个 参数,例如 select, where or tables. 这些参数都不是必须的,但是你至少要使用一个!要注意这些额外的方式对不同的数据库引擎可能存在移植性问题.
(因为你在显式的书写SQL语句),除非万不得已,尽量避免这样做
参数之select
The select 参数可以让你在 SELECT 从句中添加其他字段信息,它应该是一个字典,存放着属性名到 SQL 从句的映射。
queryResult=models.Article
.objects.extra(select={'is_recent': "create_time > '2017-09-05'"})
结果集中每个 Entry 对象都有一个额外的属性is_recent, 它是一个布尔值,表示 Article对象的create_time 是否晚于2017-09-05.
练习:
in sqlite:
article_obj=models.Article.objects
.extra(select={"standard_time":"strftime('%%Y-%%m-%%d',create_time)"})
.values("standard_time","nid","title")
print(article_obj)
# <QuerySet [{'title': 'MongoDb 入门教程', 'standard_time': '2017-09-03', 'nid': 1}]>
3)统计最近发布对文章


4)查看这个月发布的文章


5)统计年与日




# 查询当前站点每一个年月的名称以及对应的文章数
# 查看最近发布的文章
ret1 = models.Article.objects.extra(select={'is_recent':"create_time > 2018-07-28"}).values('title', 'is_recent')
# print(ret1)
# 查看这个月发布的文章
ret1 = models.Article.objects.extra(select={'y_m_date':"date_format(create_time,'%%Y-%%m')"}).values('title', 'y_m_date')
# print(ret1)
# 统计年月日
ret1 = models.Article.objects.extra(select={'y_m_date':"date_format(create_time,'%%Y-%%m')"}).values('y_m_date').annotate(c=Count('nid')).values_list('y_m_date', 'c')
#(只统计本站点,用户的)
ret1 = models.Article.objects.filter(user=user_obj).extra(select={'y_m_date':"date_format(create_time,'%%Y-%%m')"}).values('y_m_date').annotate(c=Count('nid')).values_list('y_m_date', 'c')
print(ret1)
4、日期归档查询2:

4 日期归档查询的方式2
from django.db.models.functions import TruncMonth
Sales.objects
.annotate(month=TruncMonth('timestamp')) # Truncate to month and add to select list
.values('month') # Group By month
.annotate(c=Count('id')) # Select the count of the grouping
.values('month', 'c') # (might be redundant, haven't tested) select month and count

# 时区选择
# TIME_ZONE = 'UTC'
TIME_ZONE = 'Asia/Shanghai' USE_I18N = True USE_L10N = True # 转换时区
# USE_TZ = True
USE_TZ = False


# 方式2:
from django.db.models.functions import TruncMonth ret1 = models.Article.objects.filter(user=user_obj).annotate(month=TruncMonth('create_time')).values('month').annotate(c=Count('nid')).values_list('month','c')
print(ret1)

5、views视图完整代码
def home_site(request, username):
"""
个人站点视图函数
:param request:
:return:
"""
# print("username", username)
user_obj = models.UserInfo.objects.filter(username=username).first() # 判断用户是否存在
if not user_obj:
return render(request, "blog/not_found.html") # 查询当前站点对象
blog = user_obj.blog # 当前用户或者当前站点对应的所有文章 # 方式1:基于对象查询
article_list = user_obj.article_set.all() # 方式2:基于__
article_list = models.Article.objects.filter(user=user_obj) # 跨表的分组查询的模型:
# 每一个后的表模型.objects.values("pk").annotate(聚合函数(关联表__统计字段)).values("表模型的所有字段以及统计字段") # 推荐pk字段查找 from django.db.models import Avg, Max, Min, Count, F, Q # 查询每一个分类名称以及对应的文章数
# 全部blog的
ret1 = models.Category.objects.values('pk').annotate(c=Count("article__title")).values("title", 'c')
# print(ret1) # 查询当前站点的每一个分类名称以及对应的文章数
# 只取当前用户站点的
# ret1 = models.Category.objects.filter(blog=blog).values('pk').annotate(c=Count("article__title")).values("title",'c')
cate_list = models.Category.objects.filter(blog=blog).values('pk').annotate(c=Count("article__title")).values_list("title", 'c')
# print(ret1) # 查询当前站点的每一个标签名称以及对应的文章数
ret = models.Tag.objects.values('pk').annotate(c=Count('article')).values_list('title','c')
tag_list = models.Tag.objects.filter(blog=blog).values('pk').annotate(c=Count('article')).values_list('title','c')
# print(ret)
# print(ret1) # 查询当前站点每一个年月的名称以及对应的文章数 # 查看最近发布的文章
ret1 = models.Article.objects.extra(select={'is_recent':"create_time > 2018-07-28"}).values('title', 'is_recent')
# print(ret1) # 查看这个月发布的文章
ret1 = models.Article.objects.extra(select={'y_m_date':"date_format(create_time,'%%Y-%%m')"}).values('title', 'y_m_date')
# print(ret1) # 统计年月日
ret1 = models.Article.objects.extra(select={'y_m_date':"date_format(create_time,'%%Y-%%m')"}).values('y_m_date').annotate(c=Count('nid')).values_list('y_m_date', 'c')
#(只统计本站点,用户的)
date_list = models.Article.objects.filter(user=user_obj).extra(select={'y_m_date':"date_format(create_time,'%%Y-%%m')"}).values('y_m_date').annotate(c=Count('nid')).values_list('y_m_date', 'c')
# print(ret1) # 方式2:
from django.db.models.functions import TruncMonth models.Article.objects.filter(user=user_obj).annotate(month=TruncMonth('create_time')).values('month').annotate(c=Count('nid')).values_list('month','c') return render(request, 'blog/home_site.html', {'blog':blog,'article_list':article_list,"tag_list":tag_list,"date_list":date_list, "cate_list":cate_list})
6、个人站点页面渲染
1、清除浮动

2、标签,与随笔归档,分类




7、跳转过滤功能



1、合并url
# 个人站点页面设计
re_path(r'^(?P<username>\w+)$', views.home_site, name='home_site'),
# 个人站点的跳转
re_path(r'^(?P<username>\w+)/(?P<condition>tag|category|archive)/(?P<param>.*)/$', views.home_site, name='home_site'),
2、判断是否传入kargs
def home_site(request, username, **kwargs):
print("kwargs",kwargs) user_obj = models.UserInfo.objects.filter(username=username).first() # 判断用户是否存在
if not user_obj:
return render(request, "blog/not_found.html") # 查询当前站点对象
blog = user_obj.blog # 当前用户或者当前站点对应的所有文章
article_list = models.Article.objects.filter(user=user_obj) # 判断是否跳转到其他地方
if kwargs:
condition = kwargs.get("condition") # 标签\分类\归档
param = kwargs.get("param") # 具体的哪一个
if condition == "category":
article_list = models.Article.objects.filter(user=user_obj).filter(category__title=param)
elif condition == "tag":
article_list = models.Article.objects.filter(user=user_obj).filter(tags__title=param)
print(article_list)
else:
year,month = param.split('-')
print(year,month)
article_list = models.Article.objects.filter(user=user_obj).filter(create_time__year=year,create_time__month=month)
print(article_list) from django.db.models import Avg, Max, Min, Count, F, Q
# 查询当前站点的每一个分类名称以及对应的文章数
cate_list = models.Category.objects.filter(blog=blog).values('pk').annotate(c=Count("article__title")).values_list("title", 'c') # 查询当前站点的每一个标签名称以及对应的文章数
tag_list = models.Tag.objects.filter(blog=blog).values('pk').annotate(c=Count('article')).values_list('title','c') # 统计年月日
date_list = models.Article.objects.filter(user=user_obj).extra(select={'y_m_date':"date_format(create_time,'%%Y-%%m')"}).values('y_m_date').annotate(c=Count('nid')).values_list('y_m_date', 'c') return render(request, 'blog/home_site.html', {"username":username,'blog':blog,'article_list':article_list,"tag_list":tag_list,"date_list":date_list, "cate_list":cate_list})
3、视图跳转
<div class="col-md-3">
<div class="panel panel-warning">
<div class="panel-heading">我的标签</div>
<div class="panel-body">
{% for tag in tag_list %}
<p><a href="/{{ username }}/tag/{{ tag.0 }}">{{ tag.0 }}({{ tag.1 }})</a></p>
{% endfor %} </div>
</div> <div class="panel panel-warning">
<div class="panel-heading">随笔分类</div>
<div class="panel-body">
{% for cate in cate_list %}
<p><a href="/{{ username }}/category/{{ cate.0 }}">{{ cate.0 }}({{ cate.1 }})</a></p>
{% endfor %} </div>
</div>
<div class="panel panel-warning">
<div class="panel-heading">随笔归档</div>
<div class="panel-body">
{% for date in date_list %}
<p><a href="/{{ username }}/archive/{{ date.0 }}">{{ date.0 }}({{ date.1 }})</a></p>
{% endfor %} </div>
</div>
</div>
5 功能4:个人站点页面设计(ORM跨表与分组查询)的更多相关文章
- BBS--功能4:个人站点页面设计(ORM跨表与分组查询)
查询: 日期归档查询 1 date_format ============date,time,datetime=========== create table t_mul_new(d date,t t ...
- 第十七篇 ORM跨表查询和分组查询---二次剖析
ORM跨表查询和分组查询---二次剖析 阅读目录(Content) 创建表(建立模型) 基于对象的跨表查询 一对多查询(Publish与Book) 多对多查询 (Author 与 Book) 一对一查 ...
- Django之ORM跨表操作
Django之ORM表查询及添加记录 一.创建表 - 书籍模型: 书籍有书名和出版日期,一本书可能会有多个作者,一个作者也可以写多本书,所以作者和书籍的关系就是多对多的关联关系(many-to-man ...
- ORM跨表查询总结
一.基于对象的查询-->子查询 1.一对多 正向查询:基于 字段 反向查询:基于 表名__set.all() 注意:表名全部小写 2.多对多 正向查询:基于 字段.all() 反向查询:基于 表 ...
- django框架基础-ORM跨表操作-长期维护
############### 一对一跨表查询 ################ import os if __name__ == '__main__': os.environ.setde ...
- day53:django:URL别名/反向解析&URL分发&命名空间&ORM多表操作修改/查询
目录 1.URL别名&反向解析 2.URL分发&命名空间 3.ORM多表操作-修改 4.ORM多表操作-查询 4.1 基于对象的跨表查询 4.2 基于双下划线的跨表查询 4.3 聚合查 ...
- django orm跨表查询废话最少最精简版
在model.py中: class B1(models.Model): u1= models.CharField(max_length=32) #多 class B2(models.Model): f ...
- ORM跨表查询问题
环境准备: 表结构 from django.db import models # Create your models here. class Publisher(models.Model): id ...
- 基于对象的orm跨表查询再练习
model.py from django.db import models # Create your models here. class Book(models.Model): nid = mod ...
随机推荐
- springMVC入门-05
接着上一讲,介绍如何查询单个数据,此处介绍show()方法的实现.显示单条数据需要使用Users对象中的一个字段作为入参来进行对象查询,将查询出来的数据放在Model中,并且将model中的user对 ...
- 关于解决sql2012编辑器对象名无效问题
出现以下情况: 解决办法: 选择“编辑”——“Intellisense”——“刷新本地缓存” 或者按Ctrl+Shift+R组合键
- Linux查看系统当前字符集
常用的命令展示 参考当前环境的字符集 方法一: cat /etc/sysconfig/i18n [ssh客户端工具最好也是utf-8,保持一致] 方法二:echo $LANG 设置当前环境的字符集 方 ...
- CVE-2013-2551漏洞成因与利用分析(ISCC2014 PWN6)
CVE-2013-2551漏洞成因与利用分析 1. 简介 VUPEN在Pwn2Own2013上利用此漏洞攻破了Win8+IE10,5月22日VUPEN在其博客上公布了漏洞的细节.它是一个ORG数组整数 ...
- 《C++ Primer Plus》读书笔记之六—函数探幽
第八章 函数探幽 1.常规函数与内联函数的主要区别不在于编写方式,而在于C++编译器如何将它们组合到程序中. 2.常规函数调用使程序跳到另外一个地址(函数地址),并在函数结束时返回,更详细的的实现过程 ...
- Sublime Text3 使用总结
一.简介: Sublime Text 3是一款强大而精巧的文本编辑器 [点击下载].它的界面友好.功能非凡.性能极佳可令代码高亮.语法提示.自动完成更重要的是,它支持众多插件扩展——锦上添花.强之又强 ...
- 第一次项目冲刺(Alpha版本)2017/11/19
一.当天站立式会议 会议内容 1.对数据库的设计的进一步讨论 2.讨论SSH一些配置细节 3.分配今天的任务 二.任务分解图 三.燃尽图 四.心得 1.零散的时间要利用起来,追上计划的进度. 2.在小 ...
- java Math数学工具及Random随机函数
Math类包含用于执行基本数学运算的方法,如绝对值.对数.平方根和三角函数.它是一个final类,其中定义的都是一些常量和静 态方法.常用方法如下:public static double sqrt( ...
- 对象在hibernate中的状态
首先hibernate中对象的状态有三种:瞬态.游离态和持久态,三种状态转化的方法都是通过session来调用,瞬态到持久态的方法有save().saveOrUpdate().get().load() ...
- AOP-方法拦截器-笔记
方法拦截器的继承层次图: 这些拦截器具体长什么样?? 一.MethodBeforeAdviceInterceptor 这个拦截器只有一个属性就是前置通知.需要注意的是前置通知和返回通知的拦截器才会持有 ...