码迷,mamicode.com
首页 > 其他好文 > 详细

BBS--功能4:个人站点页面设计(ORM跨表与分组查询)

时间:2018-11-22 18:15:04      阅读:246      评论:0      收藏:0      [点我收藏+]

标签:display   creat   数据库   有一个   信息   ref   关系   tle   orm   

技术分享图片
查询:
日期归档查询
   1    date_format

        ============date,time,datetime===========

        create table t_mul_new(d date,t time,dt datetime);

        insert into t_mul_new 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  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 日期归档查询的方式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   
总结

技术分享图片

(1)用户未找到,404页面构建

  # 个人站点页面设计
    re_path(r^(?P<username>\w+)$, views.home_site, name=home_site),

技术分享图片

not_found.html

技术分享图片
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <link rel="stylesheet" href="/static/blog/bootstrap-3.3.7/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/logo_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>
View Code

技术分享图片

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

def home_site(request,username):
    ‘‘‘
    个人站点视图函数
    :param request:
    :return:
    ‘‘‘
    user=UserInfo.objects.filter(username=username).first()
    # 判断用户是否存在
    if not user:
        return render(request,not_found.html)


    # 当前用户或者当前站点所对应文章
    blog=user.blog
print(blog)
技术分享图片
# 方式一基于对象查询
    # 作者和文章的关系---> 一对多(文章)
    article_list=user.article_set.all()
    # 方式二 基于双下划线 __ 跨表查询
    article_list=models.Article.objects.filter(user=user)

    return render(request, home_site.html)

2、个人站点标签与分类查询

# 跨表的分组查询的模型:
# 每一个后的表模型.objects.values("pk").annotate(聚合函数(关联表__统计字段)).values("表模型的所有字段以及统计字段")   # 推荐pk字段查找
 
# 查询每一个分类名称以及对应的文章数
 
# 查询当前站点的每一个分类名称以及对应的文章数
 
# 查询当前站点的每一个标签名称以及对应的文章数
 
# 查询当前站点每一个年月的名称以及对应的文章数

  from django.db.models import Avg, Max, Min, Sum, Count

  # 补充知识点Emp.objects.all()-----select * from emp
  # 补充知识点Emp.objects.all().values(‘name‘)-----select name from emp
 # values(‘province‘)---values(‘group by的字段‘)

技术分享图片

 

values方法可以获取字段的字典列表。

values_list可以获取字段的元组列表。
技术分享图片

 

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

  # 查询每一个分类名称以及对应的文章数
    # annotate(聚合函数(关联表__统计字段)).values("表模型的所有字段以及统计字段")
    # values(‘group by的字段‘)
    ret=models.Category.objects.values(pk).annotate(c=Count(article__title)).values(title,c)
    print(ret)

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

   # 查询当前站点的每一个分类名称以及对应的文章数
    cate_list=models.Category.objects.filter(blog=blog).values(pk).annotate(c=Count(article__title)).values(title,c)
    print(cate_list)

(3)每一个标签以及对应得文章数

# 每一个标签以及对应得文章数
    tag_list=models.Tag.objects.filter(blog=blog).values(pk).annotate(count=Count(article)).values_list(title,count)
    print(tag_list,tag_list)

(4)日期归档查询

知识点1date_format

技术分享图片

 

  create table t_mul_new(d date,t time,dt datetime);
 insert into t_mul_new values(now(),now(),now());

  select * from t_mul_new;
技术分享图片

技术分享图片 

 ---

技术分享图片

知识点2:extra

 

BBS--功能4:个人站点页面设计(ORM跨表与分组查询)

标签:display   creat   数据库   有一个   信息   ref   关系   tle   orm   

原文地址:https://www.cnblogs.com/foremostxl/p/10002478.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!