2018.7.10 个人博客文章=利用ORM创建分类和ORM的内置函数

昨天的注册收尾工作

其实就差了和MySql联系起来的部分,这部分很简单,首先要做的就是保存用户通过from传送过来的头像文件:

"""
保存头像文件
"""
file = request.FILES.get('avatar')
file_path = os.path.join('static/img', file.name)
with open(file_path, 'wb') as f:for chunk in file.chunks():f.write(chunk)  # 写文件

然后就是保存用户输入的值到对应数据库的表,利用ORM可以很简单的写出来:

v = request.POST
result = models.UserInfo.objects.create(username=v.get('username'),password=v.get('password'),email=v.get('email'),nickname=v.get('username'),avatar='/' + file_path, )

进入对应博客所需的路由配置问题

我们访问一个博客主页的时候是不需要登陆信息的只要访问类似http://127.0.0.1:8000/blog/***.html之类的网址就可以进入对应博客获取需要的信息,所以在设置路由的时候我额外加了一个参数,用来将博主的名字来作为博客网址的一部分:

re_path('^blog/(\w+).html$', views.blog)

在处理函数中多加一个name参数,用来接收(\w+)处的参数:

def blog(request, name):return render(request, 'blog.html', {'name': name})

这样路由的文件就简单解决了,后续可能会优化一些。

个人主页博客文章的类型分类(一对一)

在写博客主页之前,我想先想一想页面中展示博客文章分类的部分。

首先是获取对应的博客对象,这个很好获取,利用上面的name参数可以很简单的做到:

blog = models.Blog.objects.filter(site=name).first()

首先想到的就是利用当前博客的分类来反向查找对应的所有文章,计算出查找到的文章数就可以得到对应分类下的文章数了:

# 当前博客所有分类
cate_list = models.Category.objects.filter(blog=blog)
for item in cate_list:	# 遍历每一个分类项c = item.article_set.all().count()	# 利用分类项反向查找到对应的所有文章并计算出文章数返回print(item,c)

但是这种方法有一个不好的地方,那就是需要频繁的去数据库查询,这样后期会大大拖慢服务器的反应速度。

我想到了利用Group By来一次性查询所有需要的值,SQL语句如下:

select category_id, count(nid) as c from article where blog_id = *** group by category_id

但是用ORM来做的话需要values和annotate函数配合使用来达到分组查询的目的:

category_list = models.Article.objects.filter(blog=blog).values('category_id','category__title',).annotate(c=Count('nid'))  # 这里反向查找了分类名,为了更方便的显示在页面上

个人主页博客文章的标签分类(多对多)

 差不多的道理:

models.Article2Tag.objects.filter(tag__blog=blog).values('tag_id','tag__title').annotate(c=Count('id'))

个人主页博客文章的时间分类

时间分类需要注意的地方其实就是时间格式的转换,可以利用MySQL 中的DATE_FORMAT() 函数具体的可以参照我的小知识总结,SQL语句如下:

select date_format(create_time,'%Y-%m'),count(nid) as c from article where blog_id=1 group by date_format(create_time,'%Y-%m')

但是在ORM中怎么做呢,可以利用extra函数来为表增加额外的一个字段,以做到分组查询的目的:

date_list = models.Article.objects.filter(blog=blog).extra(select={'c': "date_format(create_time,'%%Y-%%m')"}).values('c').annotate(ct=Count('nid'))

Django ORM内置函数和函数的自定义

ORM内置函数主要有基础函数和时间函数两种:

# 基础函数
Cast, Coalesce, Concat, ConcatPair, Greatest, Least, Length, Lower, Now, Substr, Upper,
# 时间函数
Extract, ExtractDay, ExtractHour, ExtractMinute, ExtractMonth,ExtractSecond, ExtractWeekDay, ExtractYear, Trunc, TruncDate, TruncDay,TruncHour, TruncMinute, TruncMonth, TruncSecond, TruncYear,

通过annotate函数来调用这些基础函数例如:

from django.db.models import FloatField
from django.db.models import Value
v = models.Article.objects.annotate(c=functions.Cast('nid', FloatField()))
v = models.Article.objects.annotate(c=functions.Coalesce('title','summary'))
v = models.Article.objects.annotate(c=functions.Concat('nid','title','summary'))
v = models.Article.objects.annotate(c=functions.Concat('nid','title','summary',Value('666')))
v = models.Article.objects.annotate(c=functions.Greatest('nid','num'))
v = models.Article.objects.annotate(c=functions.Length('title'))
v = models.Article.objects.annotate(c=functions.Substr('title',1,1))

所有函数的功能列举如下(以下内容参照了这个大神的博客):

# ########### 基础函数 ############ 1. Concat,用于做类型转换# v = models.UserInfo.objects.annotate(c=Cast('pwd', FloatField()))# 2. Coalesce,从前向后,查询第一个不为空的值# v = models.UserInfo.objects.annotate(c=Coalesce('name', 'pwd'))# v = models.UserInfo.objects.annotate(c=Coalesce(Value('666'),'name', 'pwd'))# 3. Concat,拼接# models.UserInfo.objects.update(name=Concat('name', 'pwd'))# models.UserInfo.objects.update(name=Concat('name', Value('666')))# models.UserInfo.objects.update(name=Concat('name', Value('666'),Value('999')))# 4.ConcatPair,拼接(仅两个参数)# v = models.UserInfo.objects.annotate(c=ConcatPair('name', 'pwd'))# v = models.UserInfo.objects.annotate(c=ConcatPair('name', Value('666')))# 5.Greatest,获取比较大的值;least 获取比较小的值;# v = models.UserInfo.objects.annotate(c=Greatest('id', 'pwd',output_field=FloatField()))# 6.Length,获取长度# v = models.UserInfo.objects.annotate(c=Length('name'))# 7. Lower,Upper,变大小写# v = models.UserInfo.objects.annotate(c=Lower('name'))# v = models.UserInfo.objects.annotate(c=Upper('name'))# 8. Now,获取当前时间# v = models.UserInfo.objects.annotate(c=Now())# 9. substr,子序列# v = models.UserInfo.objects.annotate(c=Substr('name',1,2))

# ########### 时间类函数 ############ 1. 时间截取,不保留其他:Extract, ExtractDay, ExtractHour, ExtractMinute, ExtractMonth,ExtractSecond, ExtractWeekDay, ExtractYear,# v = models.UserInfo.objects.annotate(c=functions.ExtractYear('ctime'))# v = models.UserInfo.objects.annotate(c=functions.ExtractMonth('ctime'))# v = models.UserInfo.objects.annotate(c=functions.ExtractDay('ctime'))## v = models.UserInfo.objects.annotate(c=functions.Extract('ctime', 'year'))# v = models.UserInfo.objects.annotate(c=functions.Extract('ctime', 'month'))# v = models.UserInfo.objects.annotate(c=functions.Extract('ctime', 'year_month'))"""MICROSECONDSECONDMINUTEHOURDAYWEEKMONTHQUARTERYEARSECOND_MICROSECONDMINUTE_MICROSECONDMINUTE_SECONDHOUR_MICROSECONDHOUR_SECONDHOUR_MINUTEDAY_MICROSECONDDAY_SECONDDAY_MINUTEDAY_HOURYEAR_MONTH"""# 2. 时间截图,保留其他:Trunc, TruncDate, TruncDay,TruncHour, TruncMinute, TruncMonth, TruncSecond, TruncYear# v = models.UserInfo.objects.annotate(c=functions.TruncHour('ctime'))# v = models.UserInfo.objects.annotate(c=functions.TruncDate('ctime'))# v = models.UserInfo.objects.annotate(c=functions.Trunc('ctime','year'))

ORM自定义函数的写法:

from django.db.models.functions.base import Funcclass CustomeFunc(Func):function = 'DATE_FORMAT'template = '%(function)s(%(expressions)s,%(format)s)'def __init__(self, expression, **extra):expressions = [expression]super(CustomeFunc, self).__init__(*expressions, **extra)v = models.UserInfo.objects.annotate(c=CustomeFunc('ctime',format="'%%Y-%%m'"))

  

转载于:https://www.cnblogs.com/yu-jie/p/9289908.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/397542.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python 列表与元组的操作简介

上一篇:Python 序列通用操作介绍 列表 列表是可变的(mutable)——可以改变列表的内容,这不同于字符串和元组,字符串和元组都是不可变的。接下来讨论一下列表所提供的方法。 list函数 可以使用list函数来创建列表: list(Hello) [H,…

mfc嵌入matlab绘图窗口,将matlab的图嵌入MFC

【实例简介】VS调用matlab画图模块编译成的动态链接库,并在MFC显示。【实例截图】【核心代码】3b0582a3-4ea8-4a61-ba33-e448be563b88└── 将matlab的图嵌入MFC├── matlab_2010b与VS2008_混合编程的实现.pdf├── TestWithData│ ├── Debug│ │ ├─…

python multiprocessing 和tcp

#用类方法 服务端from socket import *from multiprocessing import Processimport osclass Myprocess(Process): def __init__(self, conn): self.conn conn super().__init__() def run(self): conn self.conn start True whil…

matlab 画三维花瓶,精美花瓶建模教程

1、首先,草图单位为mm,进入前视图绘制如图草图,花瓶的基本形状轮廓2、然后对草图进行旋转3、旋转出曲面后,在顶部边线新建一个基准面4、继续在前视图绘制草图,如图绘制一弧线5、然后进行旋转6、可以得到图示的两个曲面…

PKI系统相关知识点介绍

公钥基础设施(Public Key Infrastructure,简称PKI)是目前网络安全建设的基础与核心,是电子商务安全实施的基本保障,因此,对PKI技术的研究和开发成为目前信息安全领域的热点。本文对PKI技术进行了全面的分析…

android 打印java堆栈,Android打印堆栈

java打印堆栈方法一:异常对象打印堆栈Exception e new Exception("this is a log");e.printStackTrace();方法二:Log打印获取异常的堆栈并打印Log.e(“dump_test”,Log.getStackTraceString(new Throwable()));C\C打印堆栈方法一:…

实际算法项目工程上手日志C/C++

#pragma once 为了保证头文件只被编译一次,通常放在头文件的顶部 #define IN #define OUT #define INOUT 这个只在逻辑上起作用, IN 表示输入参数,指针指向的值不会修改; OUT 表示输出参数,指针指向的值会修改&a…

Arduino 控制超声波测距模块

一.实物图 二.例子代码 用到数字2 和3 引脚,还有两个就是vcc GND两个阴脚,用模块连线比较简单 转载于:https://www.cnblogs.com/caoguo/p/4785700.html

Linux安装source-code-pro字体

2019独角兽企业重金招聘Python工程师标准>>> 1.下载source-code-pro字体 从GitHub下载 https://github.com/adobe-fonts/source-code-pro/releases 2.解压文件,将OTF格式的文件夹重新命名一下,这里我命名为source-code-pro,然后将…

dft对称性 matlab实验,数字信号处理实验指导书(审)

(0???2?)上对X(ej?)均匀采样得到?X(k)?X(ej?)??2?k/N??n???x(n)e?j2?kn/N 0?k?N?1可以看到X(k)也是频域上的有限长序列,长度为N。序列X(k)称为序列x(n)的N点DFT。N称为DFT变换区间长度。 通常表示WN?e?j2?/N可将定义式表示为?X(k)??x(n)…

PI

并不是所有东西都可以套PI的,只有满足上述这类的数学关系才可以。 转速经过PI调节得到电流也是有原因的。从下图中可以发现,转速 k*Iq/s,s是拉普拉斯算子,所以也是满足积分,比例关系的。 转载于:https://www.cnblogs.…

AOP之AspectJ简单使用

为什么80%的码农都做不了架构师?>>> 参考文章: 使用AspectJ在Android中实现Aop 深入理解Android之AOP自动打印日志主要知识点: 主要是JPoint、pointcuts、advice以及他们之间的关系可以通过aj文件、或AspectJ注解的Java文件实现A…

matlab drawnow连成曲线,precision recall曲线Matlab实现

在用哈希进行检索时,常会用到precision recall曲线对其性能进行定量评价。precision recall的定义在信息检索评价指标中已做了详细说明,这里再记录一下precision recall的具体实现。precision recall曲线matlab一般使用的都是下面的版本:func…

trap

http://blog.csdn.net/elbort/article/details/8525599 http://mywiki.wooledge.org/SignalTrap转载于:https://www.cnblogs.com/flowjacky/p/4785723.html

WinSCP实现Ubuntu与 Windows 文件共享方法

2019独角兽企业重金招聘Python工程师标准>>> WinSCP是一个Windows环境下使用SSH的开源图形化SFTP客户端。同时支持SCP协议。它的主要功能就是在本地与远程计算机间安全的复制文件。WinSCP绿色中文版 一款基于SSH安全高效的FTP上传软件。WinSCP 可以执行所有基本的文…

缓存机制

缓存 缓存就是数据交换的缓冲区(称作Cache) 客户端:缓存(expires)、deflate压缩 缓存服务器:CDN/cache缓存静态内容如:html、jpg、gif、js等 静态web服务器:Apache/nginx静态服务器提…

Shell学习总结

Shell 是什么? Shell 是一个用C语言编写的程序,它是用户使用Linux的桥梁。Shell既是一种命令语言,又是一种程序设计语言。 Shell 是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务…

java有几个关键字,Java多线程常用的几个关键字

Java多线程常用的几个关键字二、volatile作用:volatile关键字的作用是:使变量在多个线程间可见(具有可见性),但是仅靠volatile是不能保证线程的安全性,volatile关键字不具备synchronized关键字的原子性。Demo1:package com.ietree…

PHP获取QQ等级,php仿QQ等级太阳显示函数

开头先引述下QQ等级的算法:设当前等级为N,达到当前等级最少需要的活跃天数为D,当前活跃天数为Dc,升级剩余天数为Dr,则:从而推出:好了,引述完成,懒得写字了,贴出代码&…

Bugfree实用心得_转

转自:http://blog.csdn.net/benkaoya/article/details/8719257 本博下有许多实用技巧 1. 什么是问题跟踪系统 问题跟踪系统(Issue Tracking System)是专门用于记录、跟踪和管理各类问题的软件。 问题跟踪系统出现于上世纪80年代,…