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.pswp.cn/news/397542.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/397542.shtml
英文地址,請注明出處:http://en.pswp.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年代,…